繁体   English   中英

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

[英]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公开的所有成员。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM