为什么PropertyInfo.SetValue不是通用方法?

时间:2009-08-07 18:37:53

标签: c# .net reflection

我看到签名是:

public virtual void SetValue(object obj, object value, object[] index)

此方法不会导致参数被装箱和取消装箱吗?

为什么这种方法不是通用的?然后它甚至可以由编译器推断,在运行时没有装箱/拆箱惩罚。

2 个答案:

答案 0 :(得分:9)

部分原因是PropertyInfo.SetValue早于泛型 - 反射从一开始就是.NET的一部分。

然而,在这种特定情况下,以任何方式使用泛型都很困难。正如您所建议的那样,编译器无法推断出此信息,因为属性信息是在运行时收集的,而不是在编译时收集的。这就是Reflection的目的。

CLR团队确保所有对象,包括值类型,而不是尝试将其用于泛型方法(可能必须导致非泛型实现,在任何情况下,由于运行时行为) ,作为System.Object工作。是的,这会导致拳击,但是由于反射的开销,拳击值类型的额外开销并不是真的令人担忧。

答案 1 :(得分:7)

如果它是通用的,要调用该方法,需要在编译时知道该类型;这会破坏使用反射的目的。所以,是的,这可能意味着可能发生装箱,但是对象是此方法唯一可用的安全类型。