繁体   English   中英

PropertyInfo.GetValue(null,null)返回null

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM