簡體   English   中英

如何在C#3.5中對泛型方法設置接口約束?

[英]How to put an interface constraint on a generic method in C# 3.5?

我希望在C#3.5中實現這樣的目標:

public void Register<T>() : where T : interface {}

我可以用類或結構來做,但是如何使用接口呢?

如果您要求向特定接口添加約束,那么這很簡單:

public void Register<T>( T data ) where T : ISomeInterface

如果您詢問某個關鍵字是否像類或結構一樣存在,以限制T的可能類型范圍,那么這是不可用的。

雖然你可以寫:

public void Register<T>( T data ) where T : class // (or struct)

你不能寫:

public void Register<T>( T data ) where T : interface

C#和CLR不支持整體接口約束,但您可以將其約束到特定接口(請參閱其他答案)。 你可以得到的最接近的是'class'並且在運行時使用反射檢查類型我害怕。 為什么你首先想要一個接口約束?

您不能要求T是一個接口,因此您必須在運行時使用反射來斷言。

如果可能的話,我選擇了這樣的解決方案。 它只適用於您希望將幾個特定接口(例如,您具有源訪問權限的接口)作為通用參數傳遞,而不是任何接口。

  • 我讓我的接口產生了問題,繼承了一個空接口IInterface
  • 我將通用T參數約束為IInterface

在源代碼中,它看起來像這樣:

  • 您希望作為通用參數傳遞的任何接口:

     public interface IWhatever : IInterface { // IWhatever specific declarations } 
  • IInterface:

     public interface IInterface { // Nothing in here, keep moving } 
  • 要放置類型約束的類:

     public class WorldPieceGenerator<T> where T : IInterface { // Actual world piece generating code } 

暫無
暫無

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

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