【问题标题】:Generic class or generic method? Which is a good practice?泛型类还是泛型方法?哪个是好习惯?
【发布时间】:2020-06-16 12:15:57
【问题描述】:

我有 3 个不同的课程:

class A
{
  public int property1;
  public int property2;
  // so on..
}

class B
{
  public int property11;
  public int property22;
  //so on.
}

class Consumer
{
  public int property111;
  public int property222;
  //so on.
}

// Business logic in other class
if (someCondition)
{
    var serviceCall1 = GetValuesForClassA();
    A obj = serviceCall.Response;
}

else if (someOtherCondition)
{
    var serviceCall2 = GetValuesForClassB();
    B obj = serviceCall2.Response;
}

获得特定类型的值后,我将通过如下通用函数将其分配给消费者类型的属性:

private void ApplyProperties<T>(T serviceResponse, Consumer obj)
 where T: class
{
    if (serviceResponse.GetType().Name == "A") // where A = class name
    {
        A newObj = (A)(object)serviceResponse;

        //Assign properties of Consumer obj here.
    }
    else if(serviceResponse.GetType().Name == "B") // where B = class name
    {
        B newObj = (B)(object)serviceResponse;

        //Assign properties of Consumer obj here.
    }
}

我遵循了this 的例子。我不清楚如何以更简洁的方式更改我的代码,因此提出了这个问题。

【问题讨论】:

  • 如果您的代码根据其类型参数的类型输入不同的代码路径,可以说它不是通用的。从某种意义上说,“通用”意味着“适用于多种事物”。您的代码没有,因为它一次只适用于一种类型。你可能在这里不需要泛型,也不需要所有的铸造魔法。使用 AutoMapper 可能会更好,尤其是当您的最终目标是可读代码时。
  • 在泛型方法中进行类型检查意味着您的设计中有一些不正确的地方。在这种情况下,使用重载方法或映射库是有意义的
  • 您是否考虑过将ApplyProperties 逻辑移入A 类和B 类?
  • 是的,但我不能这样做,因为这样做我必须在两个不同的地方编写类似类型的代码。现在 ApplyProperties 方法是 CommonHelper 类中的通用方法 @mjwills
  • 为什么不把类似的代码放在第三类中,如果需要,A 和 B 可以调用它?

标签: c# .net generics


【解决方案1】:

你可以使用模式匹配

        if (serviceResponse is A newObj) // where A = class name
        {
            //Assign properties of Consumer obj here.
        }

https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2016-12-24
    • 2021-02-16
    • 1970-01-01
    • 2010-12-26
    • 2011-03-20
    相关资源
    最近更新 更多