我在C#中使用面向方面的图书馆项目中的反射。在某些地方,它会变慢。然后我读了一篇文章,它说“你可以用加速的方式使用反射一次,生成一个直接的调用包装器字节码。”这样做的方法是什么?这种技术有什么不寻常之处?
答案 0 :(得分:1)
它只是意味着你总是可以使用反射/通用/生成代码来准备代理来完成工作而不是调用&以名义的方式反思事物。
例如,假设您必须编写一个序列化对象的方法。
public class Serializer<T>
{
void Serialize(Stream stream, T value)
{
if (object.Equals(value, null)) { return; }
var type = typeof(T);
if (type == typeof(int)) { ... return ; }
if (type == typeof(string)) { ... return; }
var properties = type.GetProperties();
foreach (property in properties)
{
var value = property.GetValue(value);
...
}
}
}
此实现在每次调用中使用了大量反射,可以通过
进行更改public class Serializer<T>
{
static private readonly Action<Stream, T> m_Serialize;
static Serializer()
{
Serializer<T>.m_Serialize = Expression.Lambda<Action<Stream, T>>(... [a lot of reflection here] ...).Compile();
}
public void Serialize(Stream stream, T value)
{
Serializer<T>.Serialize(stream, value);
}
}
反射用于使用linq表达式创建委托(在本例中)并且只会命中一次。