C# 初始化泛型类中的泛型参数

C# 初始化泛型类中的泛型参数,c#,generics,C#,Generics,好的,我有一个通用类。基本原则如下: public class GenericPrimitiveContainer<T> : IGetAndSetGenericValue { private T _value; public T Value { get { return _value; } set { _value = value;

好的,我有一个通用类。基本原则如下:

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

    public T Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
        }
    }
}
这并不是它所做的全部,因为它还检查对象的类型和值的类型,并对它们进行比较。如果它们相同,则将o(对象)指定给值。如果它们不相同,则应用转换。我不想讨论这个问题,因为这不是问题所在(我相信著名的临终遗言)

问题是值是否为string类型。正如我之前所说,我比较了这些类型,看看它们是否相同。如下所示('o'是传入的对象):

如果T是int,则没有问题。如果T是字符串,“Value”只是“null”。我无法对它执行“GetType”,甚至无法查看它是否是字符串,因为它只是null

作为一个测试,我尝试过在我知道字符串将被传递给set方法的情况下取消检查并测试set方法。值最初仍然为null,但结果正常,并已分配值

现在我知道字符串不是一个原语,所以它的工作原理与int稍有不同,但我不确定如何克服这个问题。我考虑将_值初始化为默认值(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();
        }
    }
结果:

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

记住,
GetType
需要一个对象
typeof
只需要一个编译时名称,其中包括类型参数。

null
没有类型,所以您只需排除
null
并返回false,
1!=null
我不能不认为这似乎是一个问题,为什么您首先要使用反射设置值?您能详细说明一下为什么要在泛型类中使用反射魔法吗?创建泛型是为了更方便地使用类型,包括避免反射。
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();
        }
    }
            return $"T is {typeof(T).FullName}";
T is System.Int32
T is System.String
T is System.String