首页 > 解决方案 > 如何将类名传递给 DeserializeObject,我将在运行时以字符串 c# 获得该类名

问题描述

我必须调用下面有 2 个参数的方法

public static byte[] readdata(string classtype, string msg)
{
    Encoding encoding = new System.Text.UTF8Encoding();
    string header = $"{classtype},{Guid.NewGuid().ToString()}";

    byte[] headerBytes = Encoding.UTF8.GetBytes(header);

    var test = JsonConvert.DeserializeObject<classtype>(msg);

我想将类类型传递给我将在运行时获得的方法 DeserializeObject。

但是参数是通用的,我可能会得到ClassA or ClassB or ClassC,所以我如何调用方法并将通用类名传递给我将其转换为字符串值?

readdata("ClassA" , "testmessage");

标签: c#c#-4.0

解决方案


不确定您正在尝试什么,但不应该这样做:

readdata(nameof(ClassA), "");
readdata(nameof(ClassB), "");
...

您可以使用以下重载JsonConvert.DeserializeObject

var test = JsonConvert.DeserializeObject(msg, Type.GetType("namespace.qualified.ClassA"));

假设您正在传递泛型类型参数 - 您可以尝试以下方法:

public static void readdata(string classtype, string msg)
{
    ///... your stuff
}

static void SendType<T>()
{
    readdata(typeof(T).Name, "");
}

static void Main(string[] args)
{
    SendType<ClassA>();
    SendType<ClassB>();
    SendType<ClassC>();
}

但我不确定以上是否仍能解决您的问题,您应该尝试:

public static byte[] readdata<T>(string msg)
{
    //Your code
    var test = JsonConvert.DeserializeObject<T>(msg);
}

调用语句:

readdata<ClassA>("Some message");
readdata<ClassB>("Some message");
readdata<ClassC>("Some message");

建议阅读以下Type.GetType(“namespace.abClassName”) 返回 null


推荐阅读