是否可以通过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。