在.Net中将信息与"类型"对象相关联的最有效的性能方式是什么?

Mig*_*elo 5 .net c# reflection

我想将自定义数据与Type相关联,并在运行时以极快的速度检索该数据.

这只是我的想象,是我完美的世界:

var myInfo = typeof(MyClass).GetMyInformation();

这会非常快......当然这不存在!如果它确实我不会问.呵呵 ;)

这是使用自定义属性的方式:

var myInfo = typeof(MyClass).GetCustomAttribute("MyInformation");

这很慢,因为它需要查找字符串"MyInformation"

这是一种使用Dictionary <Type,MyInformation>的方法:

var myInfo = myInformationDictionary [typeof(MyClass)];

这也很慢,因为它仍然是'typeof(MyClass)'的查找.

我知道字典非常快,但这还不够......它没有调用方法那么快.它甚至不是相同的速度顺序.

我不是说我希望它像方法调用一样快.我想将信息与类型相关联,并尽快访问它.我在问是否有更好的方法,或事件是最好的方式.

有任何想法吗??

谢谢!

编辑:

我之前在所有片段中提到的typeof(MyClass)都是实际可变的...我不知道它是一个特定的MyClass类型,它可以是任何类型:

输入myType = typeFromSomewhere;

也就是说,在这种情况下,MyClass只是说这个类是由我制作的,而且任何其他可能出现这种情况的类型也是由我制作的...所以它读取

typeof(我自己的一个类,我不知道女巫一个是它,但它肯定是我的)

编辑:结论

与字典相关的一些性能结果:

Dic.buckets | Dic.Count | Dic.Key | Ops(x17)/s | Avg.Time | Min.Time | Max.Time
-----------------------------------------------------------------------------
     17519  |    12467  |   Type  |    1051538 |  0.95?s  |  0.86?s  |  0.42ms
       919  |      912  |   Type  |     814862 |  1.23?s  |  1.14?s  |  0.46ms
   1162687  |      912  |   Type  |    1126382 |  0.89?s  |  0.81?s  |  0.33ms
       919  |      912  |   Type  |     806992 |  1.24?s  |  1.16?s  |  0.21ms
        17  |       17  |   Type  |     872485 |  1.15?s  |  1.06?s  |  0.31ms
-----------------------------------------------------------------------------
     36353  |    18160  |  String |     227520 |  4.40?s  |  3.98?s  |  0.47ms
       919  |      911  |  String |     219159 |  4.57?s  |  4.14?s  |  0.29ms
   1162687  |      911  |  String |     236384 |  4.23?s  |  3.82?s  |  0.41ms
       919  |      911  |  String |     223042 |  4.49?s  |  4.10?s  |  0.43ms
        17  |       17  |  String |     229985 |  4.35?s  |  3.94?s  |  0.28ms
Run Code Online (Sandbox Code Playgroud)

接口调用:

ops(x17)/s: 2896001
Average: 0.35?s
Min: 0.34?s
Max: 1.20?s
Run Code Online (Sandbox Code Playgroud)

虚拟电话:

ops(x17)/s: 3115254
Average: 0.32?s
Min: 0.32?s
Max: 0.65?s
Run Code Online (Sandbox Code Playgroud)

我看到我的字典估计不足!=)

似乎Dictionary of Type到任何东西比虚拟方法调用慢3到4倍.

使用字符串字典不是这种情况.那些比虚拟方法调用慢10到12倍.

所以我告诉我错了!

而且,不,我不是一个导弹!有人在评论中假设这个=)

谢谢大家.

Nol*_*rin 5

它不仅仅是你的"完美世界",它也是C#!您可以使用扩展方法精确地制作您建议的工作:

var myInfo = typeof(MyClass).GetMyInformation();
Run Code Online (Sandbox Code Playgroud)

在静态TypeUtilities类等中,您将定义以下内容:

public static InfoType GetMyInformation(this Type type)
{
    // Return InfoType object.
}
Run Code Online (Sandbox Code Playgroud)

至于你如何实际返回关于类型的信息,可以用多种方式完成.一个简单的if-block,一个静态的Dictionary,给定类型的反射(使用属性/方法),甚至是其他类型.最好的方法在很大程度上取决于上下文和您的特定使用场景.

  • 根据场景,字典或简单的if语句甚至一些反射可能是最好的.你能详细说明吗? (2认同)

Sky*_*ers 5

Dictionary<Type,Object> 适合我.