[英]Generic type as parameter which must implement a specific interface
我有一個方法,我想重新創建更通用的方法。
public Task<bool> DoSomething<T>(T t) where T : Type, IAnyInterface
如您所見,我想要一個Type作為參數,它必須實現IAnyInterface
但是如果我調用該方法,
DoSomething(typeof(ObjectThatImplementsIAnyInterface));
我收到一個錯誤:
類型'System.Type'不能在通用類型或方法'DoSomething(...)'中用作類型參數'T',沒有從'System.Type'到'IAnyInterface'的隱式轉換
那么,如何才能實現該方法接受該類型呢?
不想轉移實例,否則我想在方法DoSomething(...)中創建實例
然后只需忽略該參數。 在您的情況下,這似乎毫無用處。 讓規范在通用調用中完成:
public Task<bool> DoSomething<T>() where T : IAnyInterface
{
Type type = typeof(T);
// Or create the entire instance:
T newInstance = Activator.CreateInstance<T>();
}
呼叫:
DoSomething<ObjectThatImplementsIAnyInterface>();
編輯:創建實例的另一種方法是要求無參數構造函數:
public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
T newInstance = new T();
}
你只是想要
public Task<bool> DoSomething<T>(T t) where T : IAnyInterface
定義T
是必須實現IAnyInterface
的類型。
上面的代碼允許您將實例作為參數傳遞並推斷T
:
DoSomething(new ObjectThatImplementsIAnyInterface());
有關類型約束的更多信息: https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters
根據您的評論:
我不想轉移實例,否則我想在方法內創建實例
聽起來您可能需要new()
約束,該約束允許您在方法內部創建實例(注意:您將需要一個無參數的ctor):
public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
// now you can do this:
IAnyInterface inst = new T();
}
給定DoSomething<ObjectThatImplementsIAnyInterface>()
調用。
當然,您可以采用一種方法來傳遞或創建它
public Task<bool> DoSomething<T>(T t = null) where T : class, IAnyInterface, new()
{
// now you can do this:
IAnyInterface inst = t ?? new T();
}
如果您想在運行時知道實際的類型,那很簡單
var runtimeType = typeof(T);
你說錯了。 您需要傳遞實現接口的對象,而不是類型:
DoSomething(new ObjectThatImplementsIAnyInterface());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.