C#相当于Java类<;?扩展基础>;?

C#相当于Java类<;?扩展基础>;?,c#,C#,我希望能够用C语言编写一个类似于Java的方法。。。要传入某个超类的子类的类对象。。。但我能为C#找到的最佳方案如下: public void someMethod(Type t) { if (t == typeof(SomeType)) ... } 我是否可以在方法签名中强制参数必须是SomeType类型或其继承者之一 我不希望传入上述类型的实例。我想把类型本身作为参数传入 编辑 这里有一点背景 我想创建一个EventManager类,它包含一个字典对象和一个方法registerEven

我希望能够用C语言编写一个类似于Java的方法。。。要传入某个超类的子类的类对象。。。但我能为C#找到的最佳方案如下:

public void someMethod(Type t) {
  if (t == typeof(SomeType)) ...
}
我是否可以在方法签名中强制参数必须是SomeType类型或其继承者之一

我不希望传入上述类型的实例。我想把类型本身作为参数传入

编辑 这里有一点背景

我想创建一个EventManager类,它包含一个
字典
对象和一个方法
registerEventHandler(Type t,EventHandler eh)
,该方法将给定的
类型
映射到
事件处理程序

在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) ...
  }
}

private static Map我不太懂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();
        }
    }
}
命名空间控制台应用程序1
{
分类栏
{public void stuff(){}
班:酒吧
{ }
班:酒吧
{ }
班级计划
{
静态void Main(字符串[]参数)
{
somethod();
somethod();
}
公共静态void someMethod(),其中t:bar,new()
{
t myBar=新的t();
myBar.stuff();
}
}
}

您可以通过定义泛型类型来获得行为

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

您可以使用通用约束

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

    // do something with myType
}
public void someMethod(),其中T:SomeType{
类型myType=类型(T);
//用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);
    }
}
类事件管理器{
公共词典
HandlerMap=新字典();
公共无效注册表EventHandler(EventHandler eh)
其中TEvent:SomeEventType
{
类型eventType=typeof(TEvent);
if(!HandlerMap.ContainsKey(eventType)){
HandlerMap[eventType]=新列表();
}
HandlerMap[eventType].Add(eh);
}
}
你可以这样称呼它

var em = new EventManager();
EventHandler eh = null; // or whatever
em.RegisterEventHandler<SpecificEventType>(eh);
var em=new EventManager();
EventHandler eh=null;//或者别的什么
em.RegisterEventHandler(eh);

正如其他人所说,您可以使用泛型类型参数完成此操作。。。但是,如果您仅将值作为
类型
传递,并且希望将其作为常规参数传递(例如,因为它是以这种方式传递给您的方法的),则没有办法这样做
Type
在.NET中不是泛型的,因此没有将参数约束为表示特定类或其子类的
Type
的概念,就像没有将字符串参数约束为特定长度或更长的概念一样


如果您在调用方法时确实知道编译时的类型,那么按照使用泛型类型参数绝对是一个好办法。

为什么不执行
public void someMethod(Base b)
,然后传入
Base
或任何扩展
Base
的操作?我想这不是你想问的,但我在理解你的问题时遇到了困难。为什么你不简单地编写
public void somethod(SomeType t)
?我的问题是,在Java中,我可以有一个方法
public void somethod(ClassAh,你想传入一个类型,而不是一个类型的实例,你想让该类型扩展一个特定的类型?@EricFinn是的,这是正确的,除非我误解了,否则这不会满足我的要求。我不想传入一个对象的实例作为参数。我想传入它的类型。每个类都只有一个类型。Abstract类,还是仅仅是基类?OP没有说任何关于抽象的内容。我喜欢这种方法,但您不需要
t obj
参数。问题是要传递类型。要得到它,您需要使用
typeof(t)
@agent154:请在你的问题中添加上下文,而不是注释。你能用一个例子详细说明第一种情况吗?我不确定我是否能理解。递归的答案怎么会在这种情况下中断?@agent154:递归的答案使用泛型类型参数。我的观点是,如果你不想要泛型类型参数方法-如果你只想让一个方法接受类型为
类型的参数,那么就没有办法限制该参数的值。你怎么称呼这个方法?遗憾的是,我对C不像对Java那么熟悉。
var em = new EventManager();
EventHandler eh = null; // or whatever
em.RegisterEventHandler<SpecificEventType>(eh);