c# - 在 C# 中检查泛型方法的类型参数

标签 c# generics typechecking

是否可以在 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/

相关文章:

java - 使用非 Comparable 类 : why a run-time exception, 而不是编译时错误创建 TreeSet?

java - 如何在java中使用流畅的接口(interface)和泛型来修复对象返回类型

list - 即使在使用 isInstanceOf 检查类型后,Scala 类型不匹配错误

Erlang:为什么 Dialyzer 没有注意到这个错误?

java - Java运行时需要判断对象的类型。设计不好?

c# - 保存整个ListView的图像

c# - 不使用 XAML 绘制形状

c# - IAsyncStateMachine 如何管理 MethodBuilder 上的多个等待者?

c# - 统一: Registering the same type for two interfaces

java - 我们可以有一个字段在 Java 中实现两个或多个接口(interface)吗?