【问题标题】:CLR generic method branching based on the type of the generic argument基于泛型参数类型的 CLR 泛型方法分支
【发布时间】:2016-11-04 11:46:53
【问题描述】:

C# 中,使用泛型参数来修改泛型方法的行为通常是一种不好的做法吗?

例如:

class Foo { }
class Bar { }

void GenericMethod<T>()
{
    if (typeof(T) == typeof(Foo))
    {
        Console.WriteLine("execute action for Foo");
    }

    if (typeof(T) == typeof(Bar))
    {
        Console.WriteLine("execute action for Bar");
    }
}

void NonGenericMethod(Type type)
{
    if (type == typeof(Foo))
    {
        Console.WriteLine("execute action for Foo");
    }

    if (type == typeof(Bar))
    {
        Console.WriteLine("execute action for Bar");
    }
}

抛开性能差异不谈,两种方法的效果是一样的。

我想知道的是,使用泛型参数来修改方法的行为(进行分支)是否是一个好主意。这会被认为是副作用吗?

【问题讨论】:

  • 抛开性能差异 - 存在哪些性能差异?
  • 假设你不能使用重载(为什么不呢?),它本质上没有任何问题。
  • 您可以将该方法放在 Square 和 Circle 的基类上,所以只需使用常规继承即可。否则,差别不大。
  • @Evk 作为示例提供的实际类对于该问题并不重要。问题只是关于通用参数的用法。
  • 通用版本使用起来有点尴尬,因为T无法推断。如果非要打GenericMethod&lt;Square&gt;(),不如直接打MethodForSquares()

标签: c# .net generics clr generic-method


【解决方案1】:

使用泛型方法的好处是可以进一步调用其他泛型方法而不使用反射:

void GenericMethod<T>()
{
     AnotherGenericMethod<T>();
}

非泛型方法需要反射才能进行相同的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2020-07-04
    • 1970-01-01
    • 2019-05-04
    • 2017-11-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多