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