簡體   English   中英

根據參數返回類型的C#函數

[英]C# function that returns type according to a parameter

我想創建一個根據參數返回新對象的函數,例如:

基類:

class BaseClass
{
    public int x;
}

第一類:

class TestClassOne: BaseClass
{        
    public TestClassOne()
    {
        this.x = 1;
    }   
}

第二課:

class TestClassTwo: BaseClass
{
    public TestClassOne()
    {
        this.x = 2;
    }   
}

主要:

static void Main(string[] args)
{
    BaseClass bc = GetConstructor("TestClassOne");
    Console.WriteLine(bc.x); //Prints 1
}

static BaseClass GetConstructor(string className)
{
    if(className.Equals("TestClassOne"))
    {
        return new TestClassOne();
    }
    else if(className.Equals("TestClassTwo"))
    {
        return new TestClassTwo();
    }
    return null;
} 

我編寫的代碼運行良好,問題是當我將擁有許多派生類(如TestClassThree,TestClassFour ... TestClassThousand)時。 我如何制作一個返回正確構造函數的函數,而無需if if else或switch case等? 我認為反射將是一個不錯的選擇,但我不確定如何使用它。 謝謝!

最好是可以使用通用方法,例如在René的答案中,但是您使用的是字符串,所以事實並非如此。

分兩個步驟:

  • 獲取正確的類型;
  • 創建一個實例。

這是必需的最少代碼:

Type t = Assembly.GetExecutingAssembly().GetType("SO.BaseClass");

object o = Activator.CreateInstance(t);

如您所見,您需要知道類型的程序集和名稱空間,否則您將必須對兩者進行模糊匹配。

對於您的實施情況,我會提請注意。 您試圖做的事情叫做工廠。 考慮到要為基類添加依賴項這一事實,您將被限制為僅允許具有該基類的構造函數。 如果曾經需要某些類具有不同的基類,但是通過相同的方法提供,則需要共享一個接口。 就像其他人建議的那樣,您可以使用泛型。 這是一個沒有泛型的示例:

public static IMyInterface GetMatchingClass(string className)
    {
        Type t = Type.GetType(className);
        return (IMyInterface)Activator.CreateInstance(t);
    }

只要您返回的類都實現給定的接口,一切都是桃紅色的。

暫無
暫無

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

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