Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#重构:检查派生类的类型并将其分配给同一类的变量_C#_Polymorphism_Refactoring_Derived Class - Fatal编程技术网

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