簡體   English   中英

使用對象類型C#進行動態強制轉換

[英]Dynamic cast using Type of object C#

我有一個名為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(...)”。

你有沒有辦法這樣做?

以這種方式修改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 但是,您可以在運行時檢查類型是否具有無參數構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM