[英]PropertyInfo.GetValue(null, null) returns null
我有一个带有静态公共属性的类,称为“ Info”。 通过反射,我想获得此属性值,所以我打电话:
PropertyInfo pi myType.GetProperty("Info");
string info = (string) pi.GetValue(null, null);
只要属性是字符串类型,此方法就可以正常工作。 但实际上我的属性的类型为IPluginInfo,并且在Info属性的get访问器中实例化了PluginInfo类型(实现IPluginInfo),如下所示:
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始终为null,而PropertyInfo pi仍然有效。 我在这里缺少明显的东西吗?
您能否创建一个简短但完整的程序来演示该问题?
鉴于您在谈论插件,我的猜测是您遇到了在两个不同的程序集中定义IPluginInfo的问题。 看看本文是否有帮助。
验证它的最简单方法是先调用pi.GetValue
并将结果存储在object
变量中,然后在另一行中进行pi.GetValue
或“ as”。 这样,您可以中断调试器并在丢失之前查看返回值。
我的第一个猜测是您已经重新声明了IPluginInfo接口。 所有.NET类型均受其汇编作用域的限制。 如果在2个程序集中有相同的类文件,则有2个不同的接口碰巧具有相同的名称。
好的,谢谢你的回答。
我确实已经将plugininterface放在一个单独的.dll中,但是将该.dll放在了pluginhosts目录以及所有插件的目录中。
嗯,首先我将实现该属性有所不同:
private static PluginInfo _PluginInfo = null;
public static IPluginInfo PluginInfo
{
get
{
if (_PluginInfo == null)
{
_PluginInfo = new PluginInfo();
_PluginInfo.Name = "PluginName";
_PluginInfo.Version = "PluginVersion";
}
return _PluginInfo;
}
}
注意,这不是线程安全的,因此需要做更多的工作,但是希望您能想到:一次构建它,而不是重复构建它。
我现在将在此处停止,因为看起来其他两个人在整理第一部分时已经完成了我的其余回答。
在C#中,如果值与类型不匹配,则AS返回null。 如果您写:
object info = pi.GetValue(null, null);
Console.WriteLine(info.GetType().ToString());
你会收到什么类型的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.