[英]Is it possible to call value type operators via reflection?
因为C#运算符例如+,+ =,==是可覆盖的。 它让我认为它们是一种方法,因此想知道是否有一种方法可以在Int32上使用反射来调用它们。
那怎么样,它简单,小巧,有效:)
public T Add<T>(object x, object y)
{
return (T)Convert.ChangeType((dynamic)x + (dynamic)y, typeof(T));
}
是的,自定义运算符可以使用反射调用(它们具有特殊名称,例如op_Addition),但System.Int32不定义它们,因为基本的内置类型直接由IL操作码(如add
,而不是方法调用。
你究竟想做什么? 处理运算符的各种含义(原语(映射到特定的IL指令),自定义(映射到静态方法)和提升(由编译器作为模式提供))使这很痛苦。 如果您只想使用运算符,则可以编写通过泛型提供操作员支持的代码。 我有一些代码可以在MiscUtil中免费获得( 描述和示例 )。
作为一个无类型的例子(注意这不是非常有效,但有效):
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()();
如果添加或比较两个需要方法调用的整数,那么效率非常低,因此对基本类型的这些简单操作是代码生成的,如另一个答案中所解释的那样,并且不能使用反射调用。 一个有趣的内置值类型是decimal
(或System.Decimal
)。 此struct
支持C#中的文字值,但其行为很像真实值类型,并且公开了许多可以通过反射调用的运算符。
如果您很好奇,可以使用Reflector浏览System.Int32
公开的所有成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.