【发布时间】:2016-01-15 19:42:38
【问题描述】:
我有一个名为 IValueBridge 的通用接口,它充当通用桥梁,通过提供属性名称从任意对象获取值(也可以嵌套属性,例如 myFoo.MyProp.Name):
public interface IValueBridge<in T> : IValueBridge
{
object GetValue(T instance, string attributeName);
}
现在有一个实现类:
public class ValueBridge<T> : IValueBridge<T>
{
public object GetValue(T instance, string attributeName)
{
Func<T, object> f = // ...
return f(instance);
}
}
现在有了这个设置,我想使用那个桥来获取任意对象的值,而不知道它在编译类型时的类型。
我想要达到的目标是这样的:
object bar = ...;
var bridge = new ValueBridge<typeof(bar>();
我知道如何使用MakeTypeGeneric 通过反射创建泛型类型的实例。但是Activator.CreateInstance 返回的是object,我无法将其转换为实际类型Bar(我在编译时不知道),因此无法访问GetValue<T>。
有没有一种方法可以让我无需更多反思就可以访问GetValue<T>?我想避免更多的反射,因为该方法经常被调用,并且通过反射调用它被认为很慢。这就是我缓存要在内部调用的Func<T, object> 的原因。
【问题讨论】:
-
你试过动态吗?
-
我想
dynamic会在内部使用反射来调用我非常想避免的成员。