簡體   English   中英

初始化泛型類中的泛型參數

[英]Initialising a generic parameter in a generic class

好吧,我有一個通用類。 基礎是這樣的:

public class GenericPrimitiveContainer<T> : IGetAndSetGenericValue
{
    private T _value;

    public T Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
        }
    }
}

很好。 我在該類中也有一個SetValue方法,它接受一個對象並將其設置為使用此代碼的值:

PropertyInfo pi = this.GetType().GetProperty("Value");
            pi.SetValue(this, o, null);

這不是它的全部,因為它還檢查對象的類型和Value的類型並比較它們。 如果它們相同,則將o(對象)分配給Value。 如果它們不相同,則應用轉換。 我不會進入那個,因為那不是問題所在(着名的遺言我很確定)。

問題是如果Value是string類型。 正如我之前所說,我比較各種類型,看它們是否相同。 這如下('o'是傳入的對象):

Type t1 = Value.GetType();
        Type t2 = o.GetType();
        if (t1 == t2) ...

如果T是int,沒問題。 如果T是String,'Value'只是'null'。 我甚至不能對它做“GetType”,看它是否是一個String,因為它只是null。

作為測試,我已經嘗試過在我知道字符串將傳遞給方法的情況下擺脫檢查並測試set方法。 值仍然是最初為空,但它確定沒問題,並且分配了值。

現在我知道字符串不是原始的,因此對int有一點不同,但我不知道如何克服這個問題。 我考慮將_value初始化為默認值(T),但這不起作用。 我還在類中添加了一個構造函數,它做了同樣的事情。 這也行不通。

我也嘗試使用'where t:new()'來約束類,但這不起作用,因為String不是“具有公共無參數構造函數的非抽象類型,以便將其用作參數'T'”。

所以希望有人能夠幫助我解決這個問題。

你的問題是Value.GetType()沒有你想要的。 這是一個非常簡短的完整示例:

using System;

    static class Generic
    {
        public static string WhatIsT<T>(T value)
        {
            return $"T is {value.GetType().FullName}";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int i = 5;
            Console.WriteLine(Generic.WhatIsT(i));

            string s = "hello";
            Console.WriteLine(Generic.WhatIsT(s));

            s = null;
            Console.WriteLine(Generic.WhatIsT(s));

            Console.ReadLine();
        }
    }

WhatIsT的第一次和第二次調用WhatIsT ,但第三次調用將會出現空引用異常。

如果你真的真的真的需要知道你已被關閉的泛型類型的確切名稱 - 注意評論中的注意事項,這幾乎肯定不是正確的做法 - 只需使用typeof(T) ,像這樣:

            return $"T is {typeof(T).FullName}";

結果:

T is System.Int32
T is System.String
T is System.String

請記住, GetType需要一個對象。 typeof只需要一個編譯時名稱,其中包含類型參數。

暫無
暫無

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

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