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