PropertyInfo.GetValue(null,null)返回null

时间:2008-10-15 20:07:26

标签: c#

我有一个名为“Info”的静态公共属性的类。 通过反射我想得到这个属性值,所以我打电话:

PropertyInfo pi myType.GetProperty("Info");
string info = (string) pi.GetValue(null, null);
只要属性是string类型,

就可以正常工作。但实际上我的属性是IPluginInfo类型,并且PluginInfo类型(实现IPluginInfo)被实例化并在Info属性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始终为null,而PropertyInfo pi仍然有效。我错过了一些明显的东西吗?

5 个答案:

答案 0 :(得分:3)

你能创建一个简短但完整的程序来演示这个问题吗?

鉴于你在谈论插件,我的猜测就是你遇到了在两个不同的程序集中定义IPluginInfo的问题。看看this article是否有帮助。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

嗯,首先我会以不同的方式实现该属性:

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

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

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

答案 4 :(得分:0)

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

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

你收到什么类型的?