关于如何在旧版本的C#中打开类型,有很多答案。我的问题与如何打开泛型方法中调用的类型有关:
public T GetAxis<T>(object axisObject)
{
switch (typeof(T))
{
case Axis:
//...do something
break;
}
return null;
}
我在线路上有个错误:
case Axis axis:
错误是:
类型'System.Type‘的表达式不能由'MyNamespace.Axis’类型的模式处理。
我相信我的问题是如何在<>规范中调用Type,这样我就可以打开它。
发布于 2021-11-09 22:15:59
较新版本的C#没有特别增加任何关于打开Type
值的特性。如果您真的试图基于泛型类型进行切换,那么您可能希望遵循其他SO帖子中推荐的模式。
但是,可能有比使用泛型类型更好的方法。您试图对该类型进行switch
这一事实意味着,在调用方法时,您希望代码使用的类型有限。在这种情况下,您最好为每种类型显式地使用不同的方法。
而不是:
var axis = GetAxis<Axis>(axisObject);
var somethingElse = GetAxis<SomethingElse>(axisObject);
使用:
var axis = GetAxis(axisObject);
var somethingElse = GetSomethingElse(axisObject);
您的示例似乎没有这样做,但是如果您真正想关闭的是传入对象的类型,那么较新版本的C#确实通过模式匹配提供了一些更好的选项。例如:
public T GetAxis<T>(object axisObject)
{
switch (axisObject)
{
case Axis axis:
//...do something with `axis`
break;
case SomethingElse somethingElse:
//...do something with `somethingElse`
break;
}
return default;
}
在最后一个例子中,我不清楚T
泛型类型有什么价值:您可以用非泛型返回类型替换它。
发布于 2021-11-15 02:09:55
在处理这类事情时,我倾向于求助于以下字典:
private Dictionary<Type, Delegate> _axisCases = new Dictionary<Type, Delegate>();
您可以围绕它编写这样的代码:
public class MyCode
{
public MyCode()
{
this.SetCase<Axis>(o => new Axis());
}
private Dictionary<Type, Delegate> _axisCases = new Dictionary<Type, Delegate>();
private void SetCase<T>(Func<object, T> func)
{
_axisCases[typeof(T)] = func;
}
public T GetAxis<T>(object axisObject) where T : class
{
var t = typeof(T);
if (_axisCases.ContainsKey(t))
{
var func = (Func<object, T>)_axisCases[t];
return func(axisObject);
}
return null;
}
}
现在你可以这样称呼它:
var myCode = new MyCode();
var axis = myCode.GetAxis<Axis>(new object());
这种类型的代码最灵活。但如果你想要更接近正常的案例陈述
https://stackoverflow.com/questions/69905550
复制相似问题