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

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

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

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

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


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

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

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

如果您很好奇,可以使用Reflector浏览System.Int32公开的所有成员。

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

结构可能会重载运算符 。 这意味着有更多选项来检查您是否尝试创建一些程序化方法。

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