![](/img/trans.png)
[英]How to return instance of concrete class from method with generic return type
[英]Reading concrete class property within a generic method that doesn't get generic type instance
假設我有一個泛型方法,只是為了返回正確的類型而使其成為泛型,因此上游調用者不必轉換返回值。
public T Add<T>(string name, string details, ...)
where T: BaseClass
{
// somehow get correct ObjectType
ObjectType type = ??????;
T result = Repo.Add<T>(type, name, details, ...);
...
return result;
}
這個泛型方法的問題是我沒有得到用泛型類型表示的具體類的實例。 這意味着此方法的調用者必須顯式提供泛型類型,因為類型推斷無法完成。
public abstract class BaseClass
{
public abstract ObjectType ActualType { get; }
...
}
已實現的子類將此屬性定義為quasy常量
public class ConcreteClass: BaseClass
{
public override ObjectType ActualType
{
get { return ObjectType.SomeType; }
}
...
}
基於泛型方法調用
var result = Add<ConcreteClass>("title", "details");
如何在Add<T>
方法中獲取ActualType
的值? 我也嘗試添加new()
泛型類型約束,但是因為我的BaseClass
是抽象的,所以不能編譯,所以我無法調用
new T();
在我的方法中獲取ActualType
值。
您需要將new()
約束應用於Add
方法,如下所示:
public T Add<T>(string name, string details)
where T: BaseClass, new()
{
T result = new T();
//snip
return result;
}
public abstract class BaseClass { /* snip */ }
public class ConcreteClass: BaseClass { /* snip */ }
這意味着此代碼將起作用:
var thing = Add<ConcreteClass>("Fred", "Lives in France");
根據關於新約束的MSDN文檔:
新約束指定泛型類聲明中的任何類型參數都必須具有公共無參數構造函數。 要使用新約束,類型不能是抽象的 。
這是指傳入的類型,而不是您方法的其他約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.