【发布时间】: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 可以调用它?