C# 使用运行时生成的类型

C# 使用运行时生成的类型,c#,json.net,C#,Json.net,我有几个类要在运行时选择和实例化。例如: public class MyClassA{ public int property1 {get; set;} public string property2 {get; set;} } public class MyClassB{ public int property1 {get; set;} public string property3 {get; set;} } 比如说,MyClassB是在运行时选择的: Type t

我有几个类要在运行时选择和实例化。例如:

public class MyClassA{ 
  public int property1 {get; set;}
  public string property2 {get; set;}
}

public class MyClassB{ 
  public int property1 {get; set;}
  public string property3 {get; set;}
}
比如说,MyClassB是在运行时选择的:

Type t = Type.GetType("MyNamespace.MyClassB");
Object myType = Activator.CreateInstance(t);
现在,我想使用myType作为传递给其他类/方法的类型,如下所示

myType myDeserializedObject = JsonConvert.DeserializeObject<myType>(MyJsonString);
myType myDeserializedObject=JsonConvert.DeserializeObject(MyJsonString);
代码从不编译,并抛出“myType是一个变量,但像类型一样使用”错误

是否有任何方法或解决方法将激活的实例转换为类型?让我知道是否有任何其他方法,我应该研究。
谢谢

不能将变量
类型
作为泛型传入。改用

var myDeserializedObject = JsonConvert.DeserializeObject(MyJsonString, t);

不能将变量
类型
作为泛型传入。改用

var myDeserializedObject = JsonConvert.DeserializeObject(MyJsonString, t);

当您将变量声明为类型,或使用类型调用泛型方法时,类型检查将在编译时完成。如果直到运行时才知道类型,则不起作用。这有两个原因:

myType myDeserializedObject = JsonConvert.DeserializeObject<myType>(MyJsonString);
myType myDeserializedObject=JsonConvert.DeserializeObject(MyJsonString);
。。。不编译。编译器不知道生成myDeserializedObject的类型,也无法编译适用于myType的
DeserializeObject
版本,除非它知道myType是什么

有很多方法可以实现这一点,但在某个时候,您可能需要执行一些类型检查逻辑。也许是这样的:

if (myType == typeof(Widget))
{
    Widget myWidget = JsonConvert.DeserializeObject<Widget>(MyJsonString);
    // do something with a Widget here
}
else if (myType == typeof(Gizmo))
{
    Gizmo myGizmo = JsonConvert.DeserializeObject<Gizmo>(MyJsonString);
    // do something with a Gizmo here
}
if(myType==typeof(小部件))
{
Widget myWidget=JsonConvert.DeserializeObject(MyJsonString);
//在这里使用小部件做一些事情
}
else if(myType==typeof(Gizmo))
{
Gizmo myGizmo=JsonConvert.DeserializeObject(MyJsonString);
//在这里用小发明做点什么
}

当您将变量声明为类型,或使用类型调用泛型方法时,类型检查将在编译时完成。如果直到运行时才知道类型,则不起作用。这有两个原因:

myType myDeserializedObject = JsonConvert.DeserializeObject<myType>(MyJsonString);
myType myDeserializedObject=JsonConvert.DeserializeObject(MyJsonString);
。。。不编译。编译器不知道生成myDeserializedObject的类型,也无法编译适用于myType的
DeserializeObject
版本,除非它知道myType是什么

有很多方法可以实现这一点,但在某个时候,您可能需要执行一些类型检查逻辑。也许是这样的:

if (myType == typeof(Widget))
{
    Widget myWidget = JsonConvert.DeserializeObject<Widget>(MyJsonString);
    // do something with a Widget here
}
else if (myType == typeof(Gizmo))
{
    Gizmo myGizmo = JsonConvert.DeserializeObject<Gizmo>(MyJsonString);
    // do something with a Gizmo here
}
if(myType==typeof(小部件))
{
Widget myWidget=JsonConvert.DeserializeObject(MyJsonString);
//在这里使用小部件做一些事情
}
else if(myType==typeof(Gizmo))
{
Gizmo myGizmo=JsonConvert.DeserializeObject(MyJsonString);
//在这里用小发明做点什么
}

反序列化到
字典
或使用
JObject.Parse(MyJsonString)
而不是尝试反序列化到运行时创建的类可能会更好。如果以下答案不起作用(因为没有,接受
类型
的非泛型方法可用),您仍然可以使用一些反射魔法来动态地调用它:您最好反序列化到
字典
,或者只使用
JObject.Parse(MyJsonString)
,而不是尝试去序列化到运行时创建的类。在这种情况下,下面的答案不起作用(因为没有,接受
Type
的非泛型方法可用),您仍然可以使用一些反射魔法动态调用它:我确信您的意思是:var myDeserializedObject=jsoninvert.DeserializeObject(MyJsonString,t);在我的示例中,“t”是类型,“myType”是它的实例。我确信您的意思是:var myDeserializedObject=JsonConvert.DeserializeObject(MyJsonString,t);在我的示例中,“t”是它的类型,“myType”是它的实例。