簡體   English   中英

C#相當於Java類 <? extends Base> ?

[英]C# equivalent of Java Class<? extends Base>?

我希望能夠在C#中編寫一個方法,類似於我在Java中的方式...傳入一個Class對象,它是一些超類的子類...但我能找到的最好的C#是以下:

public void someMethod(Type t) {
  if (t == typeof(SomeType)) ...
}

有什么方法可以在方法簽名中強制執行參數必須是SomeType類型或其繼承者之一?

我不打算傳遞所述類型的實例。 我想將Type本身作為參數傳遞。

編輯

這是一個背景。

我想創建一個EventManager類,它包含一個Dictionary<SomeEventType, ICollection<EventHandler>>對象,以及一個方法registerEventHandler(Type t, EventHandler eh) ,它將給定的Type映射到EventHandler

在Java中,我會這樣做:

private static Map<Class<? extends Event>, Collection<EventHandler>> eventHandlers;

public static void registerListener(Class<? extends Event> event, EventHandler handler) {
  if (eventHandlers.get(event) == null) {
    HashMap<EventHandler> handlers = new HashMap<EventHandler>()
    eventHandlers.put(event, handlers) ...
  }
}

您可以使用通用約束。

public void someMethod<T>() where T : SomeType {
    Type myType = typeof(T);

    // do something with myType
}

這是您所需用例的實現。

class EventManager {
    public Dictionary<Type, ICollection<EventHandler>> 
        HandlerMap = new Dictionary<Type, ICollection<EventHandler>>();

    public void RegisterEventHandler<TEvent>(EventHandler eh) 
        where TEvent: SomeEventType 
    {
        Type eventType = typeof(TEvent);

        if (!HandlerMap.ContainsKey(eventType)) {
            HandlerMap[eventType] = new List<EventHandler>();
        }

        HandlerMap[eventType].Add(eh);
    }
}

你會這樣稱呼它。

var em = new EventManager();
EventHandler eh = null; // or whatever
em.RegisterEventHandler<SpecificEventType>(eh);

我真的不懂java,但你的意思是這樣的?

namespace ConsoleApplication1
{
    class bar
    { public void stuff() { } }

    class foo : bar
    { }

    class doublefoo : bar
    { }

    class Program
    {
        static void Main(string[] args)
        {
            someMethod<foo>();
            someMethod<doublefoo>();
        }

        public static void someMethod<t>() where t: bar, new()
        {
            t myBar = new t();

            myBar.stuff();
        }
    }
}

您可以通過定義泛型類型來實現此行為。

public void SomeMethod<T>(T obj) where T : AbstractClass
{
}

但是沒有什么能阻止你只使用基類作為參數

public void SomeMethod(AbstractClass obj)
{
}

正如其他人所說的那樣,你可以使用泛型類型參數來做到這一點......但是如果你只將值作為一個Type並希望將其作為常規參數傳遞(例如因為它已經以這種方式傳遞給你的方法),沒有辦法做到這一點。 Type在.NET中不是通用的,因此沒有將參數約束為表示特定類或其子類的Type的概念,就像沒有將字符串參數約束為特定長度或更長的概念一樣。

如果您在調用方法時確實知道編譯時的類型,那么根據遞歸的答案使用泛型類型參數絕對是可行的方法。

暫無
暫無

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

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