PropertyInfo.GetValue(null,null)返回null

问题描述:

我有一个名为“Info”的静态公共属性。通过反射 我想这个属性值,所以我呼吁:PropertyInfo.GetValue(null,null)返回null

PropertyInfo pi myType.GetProperty("Info"); 
string info = (string) pi.GetValue(null, null); 

这个只要属性是字符串类型的正常工作。但实际上我的财产是类型IPluginInfo和PluginInfo型(实施IPluginInfo)被instatiated并在信息属性返回的get访问,就像这样:

public static IPluginInfo PluginInfo 
{ 
    get 
    { 
     IPluginInfo Info = new PluginInfo(); 
     Info.Name = "PluginName"; 
     Info.Version = "PluginVersion"; 
     return Info; 
    } 
} 

这样,当我打电话:

IPluginInfo info = pi.GetValue(null, null) as IPluginInfo; 

info始终为空,但PropertyInfo pi仍然有效。我在这里错过了明显的东西吗?

您可以创建一个简短但完整的程序来演示问题吗?

鉴于您正在讨论插件,我的猜测是您有问题在两个不同的程序集中定义IPluginInfo。看看this article是否有帮助。

验证它的最简单方法是调用pi.GetValue,并将结果存储在object变量中,然后在另一行中执行强制转换或“as”。这样你就可以打破调试器并在丢失之前查看返回值。

+1

啊,死 - 我无法打得够快! – 2008-10-15 20:15:32

我的第一个猜测是你重新声明了IPluginInfo接口。所有的.NET类型都由它们的程序集确定范围。如果在两个程序集中有相同的类文件,则有两个不同的接口碰巧具有相同的名称。

嗯,首先我会执行该财产的方式有点不同:

private static PluginInfo _PluginInfo = null; 
public static IPluginInfo PluginInfo 
{ 
    get 
    { 
     if (_PluginInfo == null) 
     { 
      _PluginInfo = new PluginInfo(); 
      _PluginInfo.Name = "PluginName"; 
      _PluginInfo.Version = "PluginVersion"; 
     } 
     return _PluginInfo; 
    } 
} 

请注意,这需要更多一点的工作,因为它不是线程安全的,但希望你的想法:建立它一次而不是重复。

我现在就在这里停下来,因为看起来其他两个人在完成第一部分时已经完成了我的答案。

+0

要处理线程安全性,可以静态初始化变量(使用静态方法),也可以使用Lazy ! – ErikE 2016-11-01 00:27:19

在C#中,如果值与类型不匹配,AS将返回null。 如果你写:

object info = pi.GetValue(null, null); 
Console.WriteLine(info.GetType().ToString()); 

你会收到什么类型?

好的,谢谢你的所有答案。

我确实已经有一个独立的.dll插件接口,但已将这个.dll放在pluginhosts目录以及所有插件的目录中。