C# 将信息与';类型';Net中的对象?

C# 将信息与';类型';Net中的对象?,c#,.net,reflection,C#,.net,Reflection,我想将自定义数据关联到一个类型,并在运行时以惊人的速度检索该数据 这只是我对完美世界的想象: var myInfo=typeof(MyClass).GetMyInformation() 这将是非常快的。。。这当然不存在!如果是这样,我就不会问了。呵呵;) 这是使用自定义属性的方法: var myInfo=typeof(MyClass).GetCustomAttribute(“MyInformation”) 这很慢,因为它需要查找字符串“MyInformation” 这是一种使用字典的方法: va

我想将自定义数据关联到一个类型,并在运行时以惊人的速度检索该数据

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

var myInfo=typeof(MyClass).GetMyInformation()

这将是非常快的。。。这当然不存在!如果是这样,我就不会问了。呵呵;)

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

var myInfo=typeof(MyClass).GetCustomAttribute(“MyInformation”)

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

这是一种使用字典的方法:

var myInfo=myInformationDictionary[typeof(MyClass)]

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

我知道字典很快,但这还不够。。。它不如调用方法快。它甚至不是相同的速度顺序

我并不是说我希望它和方法调用一样快。我希望将信息与类型关联,并尽可能快地访问它。我在问是否有更好的方法,或者是最好的方法

有什么想法吗

谢谢

编辑:

我在前面的代码片段中提到的typeof(MyClass)实际上是可变的。。。我不知道它是一个特定的MyClass类型,它可以是任何类型:

类型myType=typefromwhere

i、 在这个例子中,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
接口调用:

ops(x17)/s: 2896001
Average: 0.35μs
Min: 0.34μs
Max: 1.20μs
虚拟呼叫:

ops(x17)/s: 3115254
Average: 0.32μs
Min: 0.32μs
Max: 0.65μs
我发现我的字典低估了!!!=)

似乎任何类型的字典都比虚拟方法调用慢3到4倍

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

所以我证明我错了

而且,不,我不是在制造导弹!!!有人在下面的评论中这样认为=)


谢谢大家。

在您的类型上声明静态属性或方法

class YourType
{
  public static string GetMyInformation()
  {
    return "Some info on this type";
  }
}
然后您可以访问代码中的数据,如下所示

var myInfo = YourType.GetMyInformation();
还是我没抓住重点?

这不仅仅是你的“完美世界”,它也是C#!您可以使用以下方法精确实现您建议的工作:

var myInfo = typeof(MyClass).GetMyInformation();
在静态
TypeUtilities
类或类似类中,您可以定义以下内容:

public static InfoType GetMyInformation(this Type type)
{
    // Return InfoType object.
}

至于如何实际返回类型上的信息,可以通过多种方式实现。一个简单的if块、一个静态的
字典
、对给定类型的反射(使用属性/方法),甚至其他。最佳方法在很大程度上取决于上下文和您的特定使用场景。

为System编写扩展方法。键入将为您执行所有此类操作的方法

嗯,你用一本
字典

如果您使用的是typeof方法,那么您就知道他们已经定义了您要查找的类型。相反,您可以声明一个
常量字符串MY\u CLASS\u TYPE\u NAME=“MyNamespace.MyClass”


它不是最漂亮的,但速度极快,不会限制您的功能。

为什么不使用
GetCustomAttributes(typeof(MyInformationAttribute),false)

依我看,使用属性在语义上是表达这样信息的正确方式。只需确保使用密封的属性类,因为这样可以提高运行时性能


不过,这并不困难,而且可能比延迟加载或以其他方式缓存属性实例更可取。当应用程序初始化时,我通常使用一个静态字段。

<代码>字典>代码>为我工作。

< P>如果类型是静态可用的,那么考虑使用类似的,

public class Data<T, V>
{
    public static V Info;
}
公共类数据
{
公共静态V信息;
}
它的用法是

Data<int, string>.Info = "A string associated with int";
Data<string, string>.Info = "A string associated with string";
Data.Info=“与int关联的字符串”;
Data.Info=“与字符串关联的字符串”;
就像

Console.WriteLine(Data<int, string>.Info);
Console.WriteLine(Data<string, string>.Info);
Console.WriteLine(Data.Info);
Console.WriteLine(Data.Info);
这是因为泛型类的静态变量对于不同的泛型参数是唯一的


如果类型不是静态可用的,那么您应该使用您的问题中提到并由其他人推荐的
字典。

正如其他人所说,您可能在进行微优化,但由于我们都在深入了解它的精神,我也会:)

NET类型类可以归结为它的运行时类型句柄,如果您不需要反射,它可以比完整类型更有效

在我刚刚运行的一个非常简单的测试中,Dictionary或任何你正在使用的东西比Dictionary快20%

typeof(object).RuntimeTypeHandle;
// and
instance.GetType().RuntimeTypeHandle;

可以用来代替完整的类型实例

您没有注意到我有一个类型变量:即var myType=typeof(something)。。。这种类型不是固定类型。不是你的错,我以前没提过。。。但我想我现在说得更清楚了!但是,如何根据类型实现不同的行为呢。我仍然需要查看查找表之类的东西。字典或简单的if语句,甚至一些反射可能是最好的,这取决于场景。你能详细说明一下吗?我已经用一个简单的仅4个buckests的结构解决了我的问题,它可以缓存以前访问过的字典项。。。现在它几乎和方法调用一样快,大多数时候。。。扩展方法并非如此,我只是在谈论性能。谢谢别担心。不过,下次在原始帖子中更具体地描述一下你的确切问题可能会有所帮助。我想是的