使用对象类型C#进行动态强制转换

时间:2013-01-14 15:04:16

标签: c# reflection casting dynamic-cast

我有一个名为A的抽象类,以及实现A的其他类(B,C,D,E,...)

我还有一个A对象列表 我希望能够动态地将该列表中的每个对象强制转换为它们的“基础”类型(即B,C,D,...),以便能够在其他方法中调用它们的构造函数。

以下是我现在所做的事情:

abstract class A { }
class B : A { }
class C : A { }
class D : A { }
class E : A { }
// ... 

class Program
{
    static void Main(string[] args)
    {
        List<A> list = new List<A> { new B(), new C(), new D(), new E() };
        // ...

        foreach (A item in list)
        {
            A obj  = foo(item);
        }
    }

    public static A foo(A obj)
    {
        if (obj.GetType() == typeof(B))
        {
            return bar((B)obj);
        }
        else if (obj.GetType() == typeof(C))
        {
            return bar((C)obj);
        }
        // ... same for D, E, ...
        return null;
    }

    public static T bar<T>(T obj) where T : class, new()
    {
        // To use the constructor, I can't have here an abstract class.
        T newObj = new T();
        return newObj;
    }

它有效,但是我想找到另一种方法,但是如果它们的类型等于我的对象的类型,则测试每个实现A的类,然后再将其强制转换。

我有近15个班级,比如B,C,D ......我可能会有更多。 为了拥有一些简单,清晰和可维护的东西,我想避免使用这种方法,以及15+“if(...)else(...)”。

你有没有办法这样做?

1 个答案:

答案 0 :(得分:9)

以这种方式修改bar

public static T bar<T>(T obj) where T : class
{
    var type = obj.GetType();
    return Activator.CreateInstance(type) as T;
}

然后修改foo

public static A foo(A obj)
{
    return bar(obj);
}

请注意,我必须删除new()约束。必须这样做是为了避免将obj强加于foo。但是,您可以在运行时检查类型是否具有无参数构造函数。