簡體   English   中英

泛型類型作為參數,必須實現特定的接口

[英]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();
}

CreateInstance的文檔

你只是想要

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.

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