簡體   English   中英

set屬性中的反射C#

[英]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.Int32YourAssembly.NameSpace.SomeType ,而不是可以解析的數字。

我認為您需要退后一步,弄清楚您要在這里完成的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM