繁体   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