【问题标题】:PropertyInfo.GetValue(null, null) returns nullPropertyInfo.GetValue(null, null) 返回 null
【发布时间】:2008-10-15 20:07:25
【问题描述】:

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

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

只要属性是字符串类型,它就可以正常工作。但实际上我的属性是 IPluginInfo 类型,并且 PluginInfo 类型(实现 IPluginInfo)被 instatiated 并在 Info 属性获取访问器中返回,如下所示:

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 仍然有效。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您能否创建一个简短但完整的程序来演示该问题?

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

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

    【讨论】:

    • 啊,该死 - 我打字不够快!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好的,谢谢大家的回答。

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

      【讨论】:

        【解决方案4】:

        嗯,首先我会稍微不同地实现该属性:

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

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

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

        【讨论】:

        • 为了处理线程安全,要么只是静态初始化变量(使用静态方法),要么使用 Lazy!
        【解决方案5】:

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

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

        你收到什么类型的?

        【讨论】:

          猜你喜欢
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-26
          • 1970-01-01
          • 2019-08-21
          相关资源
          最近更新 更多