【问题标题】:Define a type in a generic Class from a string in C#从 C# 中的字符串定义泛型类中的类型
【发布时间】:2020-02-27 12:19:25
【问题描述】:

是否可以使用字符串变量来定义泛型类的类型?我的意思是:

string myType = "System.string"
MyClass<myType> customClass = new MyClass<myType>();

我找到了一些例子,但没有一个有效。

非常感谢。

注意:通常,这些类型将是数字:float、int、double,...我从数据库中获取类型以生成通用和抽象代码。

我正在使用这个例子:Is it possible to serialize a list of System.Object objects using protocol buffers

然后,我的问题在于类型,我不知道会是哪一个,所以,使用另一个示例 (@devNull):Pass An Instantiated System.Type as a Type Parameter for a Generic Class

我不知道如何告诉使用带有参数的构造函数而不是空的。

【问题讨论】:

  • 反射是可能的,但这里真正的问题是你为什么要这样做?这通常是代码异味的迹象。
  • 要在protobuffer中序列化数据库的信息,我需要知道类型:double,int,...在我的后端,这些信息与数据的值一起存储在数据库中.为什么我使用这个不相关
  • 您发现哪些示例不起作用? this one呢?
  • 您可以运行MakeGenericType(typeArgument) 方法来制作带有参数的泛型类型。参数类型可以从字符串值加载。 There is example how to do it(你在问题中有那个链接)。
  • 这个答案终于解决了我的问题,谢谢!

标签: c# generics


【解决方案1】:

您可以使用Reflection 动态实例化类型。也就是说,如果您可以控制对象的序列化和反序列化,我建议您使用像 Newtonsoft.Json 这样的 NuGet 包,它为您的对象提供了现成的 serialising 和 deserialising 功能。

编辑:我刚刚意识到您只是从数据库中读取简单类型。在这种情况下,简单的反射就可以了。例子:

var mySingle = Activator.CreateInstance(Type.GetType("System.Single", false, true));
var myInt = Activator.CreateInstance(Type.GetType("System.Int32", false, true));
var myDouble = Activator.CreateInstance(Type.GetType("System.Double", false, true));
var myString = Activator.CreateInstance(Type.GetType("System.String", false, true), "some value".ToCharArray());

【讨论】:

  • 是的,我正在使用那个 NuGet 包,但出于其他原因
  • .Dump() 给我这个错误:'object' doesn't contain a definition for 'Dump' .... Activator.CreateInstance(Type.GetType("System.Single", false, true)).Dump();
  • 您的示例(和答案)适用于非通用类。然而 OP 询问泛型类的创建
  • @JoseteManu 忘记了.Dump() 我不小心把它留在了那里,因为我在 LINQPad 中尝试我的代码。我已经修改了我的答案。
  • @oleksa 这有点令人困惑:他说的是泛型类,但后来他说它将在 string 变量中,他列出了 float、int 和 double 作为示例.我已经给出了一些简单类型的例子;对于所有更复杂的类案例,我建议使用Newtonsoft.Json NuGet 包。
【解决方案2】:

总是有很多方法可以给猫剥皮。一种处理一小组类型的简单方法,这似乎是您想要使用协议缓冲区的方法。一小部分 if 测试可能就可以了

object x = ...;

if (x is int i)
    ...
else if (x is decimal d)
    ...

【讨论】:

  • 这实际上回答了相反的问题。 OP 正在寻求一种方法来反序列化 string,而您的答案是将对象序列化 到string。
  • OP 有一个包含类型信息的字符串。重点仍然是检查特定值并处理它们可能很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多