我需要像Add(object arg0,object arg1)之类的东西

时间:2015-07-13 10:07:59

标签: c# dynamic reflection unity3d

我有一个基类<td> {{true == patient.Alcoholic ? 'Yes' : 'No' }} </td> ,有两种方法:

MyBaseClass

该基类有一些实现,它们都提供完全不同的数据。有些可能提供int,有些可能提供Vector2,或某些复杂类型。我无法在编译时说出什么。

我想做的是添加两个不同的GetProvidedData()调用的返回值。 类似的东西:

public abstract class Baseclass
{
    public abstract Type GetProvidedType();
    public abstract object GetProvidedData();
}

当然,这会导致错误CS0019:运营商&#39; +&#39;不能应用于类型&#39;对象&#39;的操作数。和&#39;对象&#39;。

  • 我尝试使用动态关键字。但是Unity中尚未实现这一点(我使用的是5.1.1f1)。
  • 我尝试过使用反射。就像使GetProvidedData()成为通用方法一样,通过反射获取MethodInfo,使用MakeGenericMethod并调用它。当然,当被调用时,它再次为我提供了一个效率的对象。
  • 甚至Convert.ChangeType返回一个对象。那时,对我来说没用。
  • 我尝试通过反射获取+运算符(它是一个名为&#34的方法; op_Addition&#34;),但这对于像int这样的原生类型不起作用。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

一种简单的方法是构建一个Add函数,该函数接受不确定数量的参数并使用类型检查来添加。

这种方法执行速度很慢,需要手动实现每种支持类型,并要求您知道返回值类型。但它确实有效。

    using System;

    namespace AddExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                float result = Add(20, 20.3f);

                Console.WriteLine("Result: {0}", result);
                Console.ReadLine();
            }

            private static float Add(params object[] values)
            {
                float result = 0;

                foreach (var value in values)
                {
                    if (value is int)
                    {
                        result += (int) value;
                    }
                    else if (value is float)
                    {
                        result += (float) value;
                    }
                    else
                    {
                        throw new NotSupportedException("Add does not support type");
                    }
                }

                return result;
            }
        }
    }

相关问题,如果您想采用通用方式:where is op_addition in [int,float,double]