C#重构:检查派生类的类型并分配给同一类的变量

时间:2017-09-15 08:39:27

标签: c# polymorphism refactoring derived-class

我有许多派生自抽象类的类。在一个方法中,我收到一个对象,它是派生类之一。我需要检查对象的类型并分配给正确的属性。直截了当的解决方案有效,但看起来可以重构。不过我不知道如何处理它:

    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;
        }
    }

2 个答案:

答案 0 :(得分:2)

您可以像这样创建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;
}

现在您可以这样使用它:

MyDerived1 derived1;
MyDerived2 derived2;

var _ = AssignValue(entity, out derived1)
    || AssignValue(entity, out derived2);

通用函数返回bool以跳过第一次匹配的待处理类型检查

答案 1 :(得分:0)

也许你正在寻找类似的东西:

    public void AssignValue(MyBaseClass entity)
    {
        var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType());
        if (item != null)
        {
            item.SetValue(this, entity);
        }
    }