0

我正在寻找实现根据类型参数表现不同的方法的最佳方法(我不能在此处使用动态)。

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()

非常感谢 !!

4

2 回答 2

1

如果你只使用 Generic 让消费者确定返回类型怎么办:

public T process<T>(Type arg1) {...}
于 2013-07-14T07:19:48.253 回答
0

对于感兴趣的朋友,我搜索了很多,我想出了一个使用泛型和反射的解决方案:

  • 转换通用方法:
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 }));
}
于 2013-07-14T16:52:09.123 回答