我正在尝试通过为Getter
和Setter
方法创建委托来改进我的反射代码。
我的代码看起来是这样的:
MyObject obj = new MyObject();
var prop = obj.GetType().GetProperty("Prop");
var getType = typeof(Func<>).MakeGenericType(prop.PropertyType);
var setType = typeof(Action<>).MakeGenericType(prop.PropertyType);
var getMethod = prop.GetGetMethod().CreateDelegate(getType, obj);
var setMethod = prop.GetSetMethod().CreateDelegate(setType, obj);
// I'd like to change this section and not to use a dynamic!!
dynamic castedGet = Convert.ChangeType(getMethod, getType);
dynamic castedSet = Convert.ChangeType(setMethod, setType);
CreateDelegate
返回一个 Delegate
,而使用 DynamicInvoke
不是性能上的明智选择。我将
Delegate
强制转换为 Action<T> \ Func<T>
,并看到了巨大的性能提升。然后我尝试在运行时将
Delegate
转换为 Action<T> \ Func<T>
(使用 Convert.ChangeType
和 dynamic
),但我的性能受到了影响——可能是因为我使用了 dynamic
类型。我相信我可以不使用
dynamic
来完成这个操作。我猜解决方案与
expression trees
有关,但我不太确定如何编写这样的代码。如果有人有一个不使用 expression trees
的好的解决方案,那么听起来很有趣。