关于c#:PropertyInfo.GetValue(null,null)返回null


PropertyInfo.GetValue(null, null) returns null

我有一个名为"info"的静态公共属性类。通过反射,我想得到这个属性值,所以我调用:

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

只要属性是string类型,这就可以正常工作。但实际上,我的属性是iplugininfo类型,并且在info属性get访问器中安装和返回了一个plugininfo类型(实现iplugininfo),如下所示:

1
2
3
4
5
6
7
8
9
10
public static IPluginInfo PluginInfo
{
    get
    {
        IPluginInfo Info = new PluginInfo();
        Info.Name ="PluginName";
        Info.Version ="PluginVersion";
        return Info;
    }
}

我打电话的时候是这样的:

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

信息始终为空,而propertyinfo pi仍然有效。我是否遗漏了一些明显的东西?


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

考虑到您在谈论插件,我猜您遇到了在两个不同的程序集中定义iplugininfo的问题。看看这篇文章是否有帮助。

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


好的,谢谢你的回答。

我确实已经把plugininterface放在一个单独的.dll中了,但是把这个.dll放在pluginhosts目录以及所有插件的目录中了。


我的第一个猜测是您已经重新声明了iplugininfo接口。所有.NET类型都由它们的程序集确定作用域;如果在两个程序集中有相同的类文件,则正好有两个同名的不同接口。


在c中,如果值与类型不匹配,as将返回空值。如果你写:

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

你收到什么类型的?


嗯,首先,我会用一些不同的方法实现这个属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static PluginInfo _PluginInfo = null;
public static IPluginInfo PluginInfo
{
    get
    {
        if (_PluginInfo == null)
        {
           _PluginInfo = new PluginInfo();
           _PluginInfo.Name ="PluginName";
           _PluginInfo.Version ="PluginVersion";
        }
        return _PluginInfo;
    }
}

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

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