这是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));
任何建议?
答案 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);
}