某些参数类型表现不同的方法
本文关键字:方法 参数 类型 | 更新日期: 2023-09-27 18:22:18
我正在寻找实现一个根据类型参数表现不同的方法的最佳方法(我不能在这里使用dynamic)。
public class Methods { public int someMethod1() { return 1; } public string someMethod2() { return "2"; } public ??? process(System.Type arg1) ??? { if (arg1 is of type int) ?? return someMethod1(); else if (arg1 is of type string) ?? return someMethod2(); } }
如果我的例子不清楚,这里是我真正的需要:
-我的lib的用户可以从他的请求中指定他想要的返回类型,
-根据要求的类型,我必须使用不同的方法(如GetValueAsInt32()
或GetValueAsString()
)
非常感谢!!
如果您只是使用Generic来允许消费者确定退货类型:
public T process<T>(Type arg1) {...}
对于感兴趣的伙伴,我搜索了很多,并提出了一个使用泛型和反射的解决方案:
- 转换通用方法:
public static class MyConvertingClass
{
public static T Convert<T>(APIElement element)
{
System.Type type = typeof(T);
if (conversions.ContainsKey(type))
return (T)conversions[type](element);
else
throw new FormatException();
}
private static readonly Dictionary<System.Type, Func<Element, object>> conversions = new Dictionary<Type,Func<Element,object>>
{
{ typeof(bool), n => n.GetValueAsBool() },
{ typeof(char), n => n.GetValueAsChar() },
{ typeof(DateTime), n => n.GetValueAsDatetime() },
{ typeof(float), n => n.GetValueAsFloat32() },
{ typeof(double), n => n.GetValueAsFloat64() },
{ typeof(int), n => n.GetValueAsInt32() },
{ typeof(long), n => n.GetValueAsInt64() },
{ typeof(string), n => n.GetValueAsString() }
};
}
- 主要方法:
public static main()
{
// Defined by the user:
Type fieldType = typeof(double);
// Using reflection:
MethodInfo method = typeof(MyConvertingClass).GetMethod("Convert");
method = method.MakeGenericMethod(fieldType);
Console.WriteLine(method.Invoke(null, new object[] { fieldData }));
}