【发布时间】:2014-12-31 02:35:19
【问题描述】:
我想知道从对象的属性中获取价值(仅针对此问题)的最快方法是什么?
经过一番搜索,我在此站点上看到了 @MarkGravell 的帖子
他写了这段代码:
using System;
using System.Reflection;
using System.Reflection.Emit;
public class Foo
{
public Foo(int bar)
{
Bar = bar;
}
private int Bar { get; set; }
}
static class Program {
static void Main()
{
var method = new DynamicMethod("cheat", typeof(int),
new[] { typeof(object) }, typeof(Foo), true);
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Castclass, typeof(Foo));
il.Emit(OpCodes.Callvirt, typeof(Foo).GetProperty("Bar",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
).GetGetMethod(true));
il.Emit(OpCodes.Ret);
var func = (Func<object, int>)method.CreateDelegate(
typeof(Func<object, int>));
var obj = new Foo(123);
Console.WriteLine(func(obj));
}
}
或
var method = typeof(Foo).GetProperty("Bar",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.GetGetMethod(true);
var func = (Func<Foo, int>)
Delegate.CreateDelegate(typeof(Func<Foo, int>), method);
我改成
var pt = propertyInfo.PropertyType; // I dont know what is Type
var method = pt.GetProperty("Bar",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.GetGetMethod(true);
var func = (Func<Foo, object>) // I dont know what is return type so set object !!!
Delegate.CreateDelegate(typeof(Func<Foo, object>), method); // I want get value as object ?!!!
return func(entity).ToString(); // cast return value to string
但我有一个例外
Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
我不知道我的属性类型是什么它可以是任何东西如何为此目的自定义代码?
如果有人可以在没有属性类型限制的情况下以更好的方式(最快的方式)帮助我,请介绍一下
【问题讨论】:
-
在related question here查看我的回答
-
您知道您的类型有一个名为 Bar 的属性,但没有它的实际类型?对我来说这听起来很糟糕的设计,为此实现一个通用接口。
-
@HimBromBeere - 问题在这里 (Func
) T 必须设置为与属性类型相同,但如何?像这样 var pt = propertyInfo.PropertyType; (Func ) !!!!!!!!!!!!
标签: c# reflection properties delegates reflection.emit