C# 将信息与';类型';Net中的对象?
我想将自定义数据关联到一个类型,并在运行时以惊人的速度检索该数据 这只是我对完美世界的想象: 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(我自己的一个类,我不知道它是什么,但它肯定是我的) 编辑:结论 与字典相关的一些性能结果:C# 将信息与';类型';Net中的对象?,c#,.net,reflection,C#,.net,Reflection,我想将自定义数据关联到一个类型,并在运行时以惊人的速度检索该数据 这只是我对完美世界的想象: var myInfo=typeof(MyClass).GetMyInformation() 这将是非常快的。。。这当然不存在!如果是这样,我就不会问了。呵呵;) 这是使用自定义属性的方法: var myInfo=typeof(MyClass).GetCustomAttribute(“MyInformation”) 这很慢,因为它需要查找字符串“MyInformation” 这是一种使用字典的方法: va
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的结构解决了我的问题,它可以缓存以前访问过的字典项。。。现在它几乎和方法调用一样快,大多数时候。。。扩展方法并非如此,我只是在谈论性能。谢谢别担心。不过,下次在原始帖子中更具体地描述一下你的确切问题可能会有所帮助。我想是的