Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET反射-检查类型信息和检索性能属性_C#_.net_Performance_Reflection_Attributes - Fatal编程技术网

C# .NET反射-检查类型信息和检索性能属性

C# .NET反射-检查类型信息和检索性能属性,c#,.net,performance,reflection,attributes,C#,.net,Performance,Reflection,Attributes,我看了很多关于.NET反射性能的文章,我知道使用反射调用方法和检索属性值的性能代价很高,比直接调用慢2-3倍 但是类型信息和属性呢?我知道类型元数据缓存在.NET中…所以我认为它不应该以性能为代价,它类似于在字典或列表中搜索(但我不确定). 检查类型信息以检查属性类型和获取属性类型的自定义属性的速度有多慢 基于属性使许多事情正常工作的做法和设计是否很糟糕 我想做的是为ASP.NET创建一些基础设施,这些基础设施将检查许多控件和类型的自定义属性,以便检索有关需要在页面上注册的JavaScript文

我看了很多关于.NET反射性能的文章,我知道使用反射调用方法和检索属性值的性能代价很高,比直接调用慢2-3倍

但是类型信息和属性呢?我知道类型元数据缓存在.NET中…所以我认为它不应该以性能为代价,它类似于在字典或列表中搜索(但我不确定).
检查类型信息以检查属性类型和获取属性类型的自定义属性的速度有多慢

基于属性使许多事情正常工作的做法和设计是否很糟糕


我想做的是为ASP.NET创建一些基础设施,这些基础设施将检查许多控件和类型的自定义属性,以便检索有关需要在页面上注册的JavaScript文件和客户端代码的信息。

如果您直接分析您的用例,您将得到最佳答案。毕竟,稍微反省一下也不错。可以进行很多反思。使用Stopwatch类为您的备选方案计时。

如果您直接分析您的用例,您将得到最佳答案。毕竟,稍微反省一下也不错。可以进行很多反思。使用Stopwatch类为您的备选方案计时。

基于属性构建体系结构不是一件坏事,但如果您想保持灵活性,您必须引入一个接口/实现,以在编程上独立于属性提供这些信息,并基于属性定义一个默认实现

读取属性并不慢,但如果您关心微优化,您可以创建自己的缓存,如下所示:

static public class Metadata<T>
{
    static public readonly Type Type = typeof(T); //cache type to avoid avcessing global metadata dictionary

    static public class Attribute<TAttribute>
        where TAttribute : Attribute
    {
            static public readonly TAttribute Value = Metadata<T>.Type.GetCustomAttributes(Metadata<TAttribute>.Type).SingleOrDefault() as TAttribute; 
    }
}

//usage
Metadata<MyType>.Attribute<MyAttributeType>.Value; //exception if more then once and null if not defined.
静态公共类元数据
{
静态公共只读类型Type=typeof(T);//缓存类型以避免访问全局元数据字典
静态公共类属性
其中:属性
{
静态公共只读TatAttribute值=Metadata.Type.GetCustomAttributes(Metadata.Type).SingleOrDefault()作为TatAttribute;
}
}
//用法
Metadata.Attribute.Value//如果不止一次,则异常;如果未定义,则为null。

基于属性构建体系结构不是一件坏事,但如果您想保持灵活性,必须引入接口/实现,以在编程上独立于属性提供这些信息,并定义基于属性的默认实现

读取属性并不慢,但如果您关心微优化,您可以创建自己的缓存,如下所示:

static public class Metadata<T>
{
    static public readonly Type Type = typeof(T); //cache type to avoid avcessing global metadata dictionary

    static public class Attribute<TAttribute>
        where TAttribute : Attribute
    {
            static public readonly TAttribute Value = Metadata<T>.Type.GetCustomAttributes(Metadata<TAttribute>.Type).SingleOrDefault() as TAttribute; 
    }
}

//usage
Metadata<MyType>.Attribute<MyAttributeType>.Value; //exception if more then once and null if not defined.
静态公共类元数据
{
静态公共只读类型Type=typeof(T);//缓存类型以避免访问全局元数据字典
静态公共类属性
其中:属性
{
静态公共只读TatAttribute值=Metadata.Type.GetCustomAttributes(Metadata.Type).SingleOrDefault()作为TatAttribute;
}
}
//用法
Metadata.Attribute.Value//如果不止一次,则异常;如果未定义,则为null。

与什么相比,它的性能如何?对于检索属性值、调用方法等,使用反射和不使用反射有明显的区别。但是你不能说“通过反射获取类型信息比没有反射要慢”,因为没有反射就无法获取类型信息。即使反射比没有反射的代码慢,一般来说还是相当快的。如果在请求-响应生命周期中,您将只使用来检查ASP.NET页面上的属性,那么我严重怀疑您以这种方式使用反射是否会对性能产生任何可测量的影响,所以请继续。性能问题通常会在您在紧密循环中每秒多次碰到反射时出现。最后,您的里程数会有所不同,我建议您进行测试,确保没有性能问题。@hvd我理解,但如果我使用OOP(接口/抽象等)进行此操作,速度会慢得多。…它可能会工作到,但是我的基础设施将变得不那么灵活…@AlexDn:因为这只是ASP.NET请求-响应的东西,我建议你使用灵活/可维护的基础设施。我怀疑您是否会从中获得主要的性能影响(仅网络通信本身就远远超过您可能使用反射进行的任何操作)。如果您最终构建了一个反射成为可测量问题的服务,那么您的系统可能会获得足够的流量/使用率,这将是一个很好的问题。:)@AlexDn您应该能够缓存大量信息,并避免在每次请求时重新计算。如果你做到了这一点,你就不需要每分钟约40000次检查,也不会对性能产生可测量的影响。(但如果你没有弄清楚,我真的不知道反射的性能有多好。)与什么相比,它的性能如何?对于检索属性值、调用方法等,使用反射和不使用反射有明显的区别。但是你不能说“通过反射获取类型信息比没有反射要慢”,因为没有反射就无法获取类型信息。即使反射比没有反射的代码慢,一般来说还是相当快的。如果在请求-响应生命周期中,您将只使用来检查ASP.NET页面上的属性,那么我严重怀疑您以这种方式使用反射是否会对性能产生任何可测量的影响,所以请继续。性能问题通常会在您在紧密循环中每秒多次碰到反射时出现。最后,您的里程数会有所不同,我建议您进行测试,确保您没有性能问题。@hvd我理解,但确实如此吗