[英]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.