C#重构:检查派生类的类型并将其分配给同一类的变量
我有许多从抽象类派生的类。在方法中,我接收一个对象,它是派生类之一。我需要检查对象的类型并指定正确的属性。直截了当的解决方案可以工作,但看起来可以重构。不过,我不知道如何处理这个问题:C#重构:检查派生类的类型并将其分配给同一类的变量,c#,polymorphism,refactoring,derived-class,C#,Polymorphism,Refactoring,Derived Class,我有许多从抽象类派生的类。在方法中,我接收一个对象,它是派生类之一。我需要检查对象的类型并指定正确的属性。直截了当的解决方案可以工作,但看起来可以重构。不过,我不知道如何处理这个问题: public MyDerived1 derived1; public MyDerived2 derived2; // .... public MyDerivedX derivedX; public void AssignValue(MyBaseClass entity)
public MyDerived1 derived1;
public MyDerived2 derived2;
// ....
public MyDerivedX derivedX;
public void AssignValue(MyBaseClass entity)
{
var derivedOne = entity as MyDerived1;
if (derivedOne != null)
{
derived1 = derivedOne;
return;
}
var derivedTwo = entity as MyDerived2;
if (derivedTwo != null)
{
derived2 = derivedTwo;
return;
}
// ....
var derivedEx = entity as MyDerivedX;
if (derivedEx != null)
{
derivedX = derivedEx;
return;
}
}
您可以创建
AssignValue
的通用版本,如下所示:
private static bool AssignValue<T>(MyBaseClas entity, out T derived) where T : MyBaseClas
{
var t = entity as T;
if (t == null)
{
derived = null;
return false;
}
derived = t;
return true;
}
泛型函数返回
bool
跳过第一次匹配时挂起的类型检查
public void AssignValue(MyBaseClass entity)
{
var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType());
if (item != null)
{
item.SetValue(this, entity);
}
}
为什么不使用“is”关键字?有关更多信息,请参见此处:您可以使用一组语句,如MyDerived1的
derived1=entity代码>
public void AssignValue(MyBaseClass entity)
{
var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType());
if (item != null)
{
item.SetValue(this, entity);
}
}