[英]Reflection c# in a set property
嘗試獲取值的類型時,為什么不能在set屬性中使用值詞?
set
{
Type t = value.GetType();
if (dictionaries[int.Parse(value.GetType().ToString())] == null)
{
dictionaries[int.Parse(value.GetType().ToString())] = new Dictionary<string,t>();
}
}
它在我的Dictionary構造函數中無法識別單詞t。 我究竟做錯了什么? 我該如何解決?
您不能將值或類型名稱用作通用類型參數。 使用帶有泛型類型參數的方法:
void SetDict<T>(T value)
{
Type t = typeof(T);
if (dictionaries[t.FullName] == null)
{
dictionaries[t.FullName] = new Dictionary<string,T>();
}
}
除了使用類型名稱,您還可以將Type
值直接用作字典的鍵:
Dictionary<Type, Dictionary<string,T>> dictionaries;
您可以在不指定泛型類型參數的情況下調用它,因為編譯器可以推斷類型。 但是,這僅適用於靜態類型,不適用於運行時類型。 也就是說,您必須使用正確類型的表達式而不是通過像object
這樣的基本類型來調用方法。
SetDict("hello"); // ==> string type
SetDict(42); // ==> int type
object obj = "world";
SetDict(obj); // ==> object type, not string type!
注意:通用類型參數使您可以在編譯時創建強類型專用類型和方法。 強類型化的優點在於,編譯器和IDE可以為您提供有關類型的信息,並在編譯時證明您的代碼靜態正確。 在RUNTIME創建通用類型沒有任何優勢,因為您將無法在編譯時(或設計時,如果願意)使用其優勢。 您也可以使用Dictionary<string, object>
等。
請查看我對代碼審查的回答: 各種類型的類型安全字典 。 特別是我對答案的更新。
在聲明泛型類型時,不能使用Type
變量 ,而必須使用實際類型。
換句話說,這是行不通的:
Type t = ....
var x = new Dictionary<string, t>();
根據您的班級,您可以執行以下操作:
public class Something<T>
{
public T Value
{
...
set
{
... new Dictionary<string, T>();
}
}
}
但這不完全一樣。
您還遇到了另一個問題:
int.Parse(value.GetType().ToString())
不管用。
value.GetType().ToString()
可能會生成類似System.Int32
或YourAssembly.NameSpace.SomeType
,而不是可以解析的數字。
我認為您需要退后一步,弄清楚您要在這里完成的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.