如何使用Reflection生成直接调用包装器字节码?

时间:2017-02-18 16:58:57

标签: c# reflection

我在C#中使用面向方面的图书馆项目中的反射。在某些地方,它会变慢。然后我读了一篇文章,它说“你可以用加速的方式使用反射一次,生成一个直接的调用包装器字节码。”这样做的方法是什么?这种技术有什么不寻常之处?

1 个答案:

答案 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表达式创建委托(在本例中)并且只会命中一次。