Search code examples
c#polymorphismrefactoringderived-class

C# Refactoring: check type of the derived class and assign to a variable of the same class


I have a number of classes that derived from an abstract class. In a method, I receive an object, which is one of the derived classes. I need to check the type of an object and assign to a correct property. The straightforward solution works, but looks like it can be refactored. I do not know how to approach it, though:

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

Solution

  • You can create generic version of AssignValue like this:

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

    now you can use it in this way:

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

    Generic function returns bool to skip pending type checks on first match