使用反射获取类型以提供给泛型类

发布于 2025-01-07 21:30:29 字数 529 浏览 0 评论 0原文

如何使用类名字符串获取类名/类型?就像

Dictionary<string, string> DFields = GetFields();

理想的类型

Dictionary<string, string>
object = Deserialize<?>(_stream)

一样,我在想:

object = Deserialize<"Dictionary<string, string>">(_stream)

它应该成为

object = Deserialize<Dictionary<string, string>>(_stream) 

为了工作。我序列化了 10 个对象,但我只有字符串格式的类型名称。我需要将字符串格式格式化为实际类型,以便我可以将其提供给通用序列化器反序列化器函数。

How do I get the class name/type using the class name string? like

Dictionary<string, string> DFields = GetFields();

the type is

Dictionary<string, string>
object = Deserialize<?>(_stream)

Ideally, I was thinking:

object = Deserialize<"Dictionary<string, string>">(_stream)

It should become

object = Deserialize<Dictionary<string, string>>(_stream) 

in order to work. Im serializing like 10 object but I only have the type names in string format. I need to format the string format to actual type so I can feed it to the generic serializer deserializer function.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少年亿悲伤 2025-01-14 21:30:29

第 1 步 - 获取类型实例

您需要使用传递到 Type.GetType() 的程序集限定名称。
通过在 Dictionary() 类型实例上调用 GetType().AssemblyQualifiedName 进行快速测试,结果是:

System.Collections.Generic.Dictionary`2[[System.String,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089],[System.String,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]], mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089

相当混乱。我相信你可以删除其中的大部分,但它仍然有效:

System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib

因此:

var typeName = "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib";
var type = Type.GetType( typeName );

第 2 步(假设 API 强制使用通用参数,IMO 是狗屎) - 使用动态参数化泛型方法的反射:

var genericMethod = typeof(Serialzier).GetMethod( "Deserializer" );
var parametizedMethod = genericMethod.MakeGenericMethod( type );
var parameters = new object[] { _stream };
var deserializedInstance = parametizedMethod.Invoke( null, parameters );

Step 1 - Get type instance:

You need to use an assembly qualified name passed into Type.GetType().
Doing a quick test by calling GetType().AssemblyQualifiedName on a Dictionary() type instance, it turns out to be:

System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

quite a mess. I believe you can remove most of it though and it'll still work:

System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib

therefor:

var typeName = "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib";
var type = Type.GetType( typeName );

Step 2 (assuming the API forces a generic parameter which IMO is shit) - Use reflection to parametize the generic method dynamically:

var genericMethod = typeof(Serialzier).GetMethod( "Deserializer" );
var parametizedMethod = genericMethod.MakeGenericMethod( type );
var parameters = new object[] { _stream };
var deserializedInstance = parametizedMethod.Invoke( null, parameters );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文