gpt4 book ai didi

c# - 如何使用反射生成直接调用包装器字节码?

转载 作者:行者123 更新时间:2023-11-30 12:40:17 26 4
gpt4 key购买 nike

我在 C# 的面向方面库项目中使用反射。在某些地方,它变得更慢。然后我读了一篇文章,它说“您可以通过生成直接调用包装器字节码来加速使用一次反射。”有什么方法可以做到这一点?这种技术有什么不寻常之处?

最佳答案

这只是意味着您始终可以使用反射/通用/生成的代码来准备委托(delegate)来完成工作,而不是以名义上的方式调用和反省事物。

例如,假设您必须编写一个方法来序列化一个对象。

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

关于c# - 如何使用反射生成直接调用包装器字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com