簡體   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