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