4

这是 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));

有什么建议吗?

4

3 回答 3

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
于 2013-10-19T12:53:37.297 回答
1

反射是必需的,但重要的是这种方法是非常值得怀疑的,并且不是 100% 可能的,因为您不能将 aobject转换为 a long。尝试运行以下命令:

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

正如 Sriram 所展示的,可以实现特定于类型的方法,但我认为这会破坏您的问题/设计的目的。简单地使用具有不同参数类型(即 int[]、long[] 等)的重载方法也会更容易,这有助于确保强制转换不会引发异常。

于 2013-10-19T13:01:32.323 回答
1

正如@nawfal 提到的,您可以将 ITest 用作通用:

public interface ITest<T>
{

    T MyMethod(params object[] args);
}
于 2013-10-19T13:04:31.330 回答