在一个泛型类中初始化一个泛型参数

3

好的,我有一个通用类。基础如下:

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);

它不仅能检查对象的类型和值的类型并对其进行比较,如果它们相同,则将对象 o 赋给 Value。如果它们不同,则会应用转换。我不会深入讨论这一点,因为这不是问题所在(这肯定是最后的臭屁话)。

问题在于如果 Value 是字符串类型。正如我之前所说,我比较类型以查看它们是否相同。具体而言(其中 'o' 是传递进来的对象):

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

如果 T 是 int,那么没有问题。如果 T 是 String,则 'Value' 只是 'null'。我甚至无法对其执行 'GetType' 以查看它是否为 String,因为它只是 null。
作为测试,我尝试摆脱检查并在我知道字符串将传递给方法的情况下测试设置方法。Value 最初仍然为空,但它还是可以工作并且 Value 被分配了。
现在我知道字符串不是原始类型,所以它的工作方式会有所不同于 int,但我不确定如何解决这个问题。我考虑将 _value 初始化为 default(T),但这并没有起作用。我还为类添加了一个构造函数,该构造函数做了同样的事情。那也没用。
我还尝试使用“where t:new()”来限制类,但这不起作用,因为 String 不是“具有公共无参数构造函数的非抽象类型,以便将其用作参数'T'”。所以希望有更聪明的人能帮帮我。

null has no type so surely you just exclude null and return false, 1 != null - Liam
2
我不禁觉得这似乎是一个XY问题。你为什么要首先使用反射来设置值? - Liam
2
你能否详细说明为什么在泛型类中使用反射技术?泛型是为了更方便地使用类型,包括避免使用反射。 - dymanoid
1个回答

4
你遇到的问题是 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的第一次和第二次调用都没问题,但第三次会出现空引用异常。

如果你真的真的真的需要知道你被封闭的泛型类型的确切名称 - 并且请注意评论中的警告,这几乎肯定不是正确的操作 - 只需使用typeof(T),像这样:

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

结果:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接