是否可以通过反射调用值类型操作符?

时间:2009-08-09 14:39:55

标签: c# reflection

作为C#运营商,例如+,+ =,==是可以覆盖的。它让我认为它们是一种方法,因此想知道是否有一种方法可以在Int32上使用反射调用它们。例如。

5 个答案:

答案 0 :(得分:9)

这个怎么样,它很简单,小而且有效:)

public T Add<T>(object x, object y)
{
    return (T)Convert.ChangeType((dynamic)x + (dynamic)y, typeof(T));
}

答案 1 :(得分:7)

是的,自定义运算符可以使用反射调用(它们具有特殊名称,例如op_Addition),但System.Int32不定义它们,因为基本的内置类型由IL操作码直接处理,如{{ 1}},而不是方法调用。

答案 2 :(得分:4)

你想要做什么?处理运算符的各种含义(原语(映射到特定的IL指令),自定义(映射到静态方法)和提升(由编译器作为模式提供))使这很痛苦。如果您只想使用运算符,则可以编写通过泛型提供操作员支持的代码。我有一些代码可以在MiscUtildescription and examples)中免费获得。


作为一个无类型的例子(注意这不是非常有效,但有效):

object x = 123, y = 345; // now forget that we know that these are ints...
object result = Expression.Lambda<Func<object>>(
    Expression.Convert(Expression.Add(
        Expression.Constant(x), Expression.Constant(y)),
    typeof(object))).Compile()();

答案 3 :(得分:0)

如果添加或比较两个需要方法调用的整数,那么效率非常低,因此对基本类型的这些简单操作是代码生成的,如另一个答案中所述,并且不能使用反射调用。一个有趣的内置值类型是decimal(或System.Decimal)。这个struct支持C#中的文字值,但其行为很像真正的值类型,并且暴露了许多可以通过反射调用的运算符。

如果您感到好奇,可以使用Reflector浏览System.Int32曝光的所有成员。

答案 4 :(得分:0)

这里有很好的答案,所以只是添加一些未提及的内容:

结构可能有operator overloaded。这意味着有更多选项来检查您是否尝试创建一些程序化方法。

尝试一个好的方法是尝试表达式树方法。 Here是一个小样本。当然,性能不是太好,但我们知道无论如何我们正在使用Reflection。