使用类型为DataType的通用方法

时间:2013-10-19 12:38:14

标签: c# generics type-conversion

这是ITest界面:

public interface ITest
{
    Type ReturnType { get; }

    Object MyMethod(params object[] args);

}

和测试类:

public class Test: ITest
{
    public Type ReturnType { get { return typeof(long); } }

    public Object MyMethod(params object[] args)
    {
        long sum = 0;
        foreach(object arg in args)
        {
          sum += (long)arg;
        }
        return sum;
    }
}

所以我需要一种方法,将ITest方法的结果自动转换为ReturnType类型。

我想这样的事情:

public T Transform<T>(Type T, object result)
{
   return (T)result;
}

并使用像这样:

Test test = new Test();
long result = Transform(test.ReturnType, test.MyMethod(1,2,3,4));

但是你知道我不能使用像这样的泛型方法,我想要声明返回类型明确地像这样:

long result = Transform<long>(test.MyMethod(1,2,3,4));

任何建议?

3 个答案:

答案 0 :(得分:1)

如果没有反思,你所要求的确切是不可能的。

您可以将ITest标记为Generic,从此一切都变得轻松。

public interface ITest<T>
{
    Type ReturnType { get; }//redundatnt

    T MyMethod(params object[] args);
}


public class Test : ITest<long>
{
    public Type ReturnType { get { return typeof(long); } }//redundatnt

    public long MyMethod(params object[] args)
    {
        long sum = 0;
        foreach (object arg in args)
        {
            long arg1 = Convert.ToInt64(arg);
            sum += arg1;
        }
        return sum;
    }
}

Test test = new Test();
long result = test.MyMethod(1,2,3,4);//No transform nothing, everything is clear

答案 1 :(得分:1)

需要反思,但重要的是这种方法非常值得怀疑,而且不能100%实现,因为你无法将object强加给long。尝试运行以下内容:

    static void Main()
    {
        int i = 1;
        object o = i;
        long l = (long)o;
    }

正如Sriram所证明的那样,可以实现类型特定的方法,但我认为这会破坏你的问题/设计的目的。简单地使用不同参数类型(即int [],long []等)的重载方法也更容易,这样可以确保转换不会抛出异常。

答案 2 :(得分:1)

正如@nawfal所提到的,你可以使用ITest作为Generic:

public interface ITest<T>
{

    T MyMethod(params object[] args);
}