【问题标题】:Use Generic Method With Type DataType使用 DataType 类型的泛型方法
【发布时间】:2013-10-28 06:26:09
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 反射是一种选择吗?那么就有可能
  • 那么根本不可能(据我所知)
  • 为什么不想将类型参数传递给泛型方法?
  • 为什么ITest 没有泛型?
  • @nawfal 你说得对,这是个不错的选择

标签: c# generics type-conversion


【解决方案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

【讨论】:

  • 我会说这种方法违背了问题的目的
  • 您也不能保证Convert.ToInt64 对作为参数传入的对象有效。
  • @Moho 你应该知道方法在做什么,需要传入什么
【解决方案2】:

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

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

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

【讨论】:

  • 这绝对不能回答问题
  • @SriramSakthivel 虽然你是对的,但我已经看到成员回答了 OP 方法中的潜在陷阱,即使是知名成员也是如此。
  • 我发现很多时候,对 SO 问题的真正答案不是如何让某些东西按照申请人的意愿工作,而是帮助他们理解为什么他们的方法很困难(即它是不正确的) )。
【解决方案3】:

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

public interface ITest<T>
{

    T MyMethod(params object[] args);
}

【讨论】:

  • 这是 10 分钟前回答的内容,更详细。
猜你喜欢
  • 2011-03-21
  • 2012-01-11
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多