是否可以在 C# 中做这样的事情:
public void DoSomething<T>(T t)
{
if (T is MyClass)
{
MyClass mc = (MyClass)t
...
}
else if (T is List<MyClass>)
{
List<MyClass> lmc = (List<MyClass>)t
...
}
}
最佳答案
是的:
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
您需要通过转换为对象有点奇怪,但这正是泛型的工作方式 - 泛型类型的转换并不像您预期的那么多。
当然另一种选择是使用正常的执行时间检查:
MyClass mc = t as MyClass;
if (mc != null)
{
// ...
}
else
{
List<MyClass> lmc = t as List<MyClass>;
if (lmc != null)
{
// ...
}
}
当然,如果 t
为 null,那将与第一个代码块的行为不同。
我会尝试尽可能避免这种代码,但是 - 有时可能是必要的,但是泛型方法的想法是能够编写泛型对任何类型都以相同方式工作的代码。
关于c# - 在 C# 中检查泛型方法的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004508/