C# 将对象解析为动态提供的类型

C# 将对象解析为动态提供的类型,c#,asp.net,.net,linq,generics,C#,Asp.net,.net,Linq,Generics,我在C#中使用了以下通用方法,将ASP.NET web表单应用程序中的客户端数据解析为某种定义类型: public static T ParseClientRequest <T> (object data) { var t = (System.Collections.Generic.Dictionary<string,object>) data; T obj = (T)Activator.CreateInstance(typeof(T)); fo

我在C#中使用了以下通用方法,将ASP.NET web表单应用程序中的客户端数据解析为某种定义类型:

public static T ParseClientRequest <T> (object data) 
{
    var t = (System.Collections.Generic.Dictionary<string,object>) data;
    T obj = (T)Activator.CreateInstance(typeof(T));
    foreach(var pair in t) {
        FieldInfo field = obj.GetType().GetField(pair.Key);
        field.SetValue(obj, pair.Value);
    }
    return obj;
}
publicstatict ParseClientRequest(对象数据)
{
var t=(System.Collections.Generic.Dictionary)数据;
T obj=(T)Activator.CreateInstance(typeof(T));
foreach(t中的var对){
FieldInfo field=obj.GetType().GetField(pair.Key);
字段设置值(对象,对值);
}
返回obj;
}
我有两个问题:

  • 是否有任何有效的方法(使用LINQ或其他)可以不使用循环来完成这项工作?或者它是否足够有效
  • 如果类型的某个字段的类型不是string,则代码将引发异常。如何将对象类型解析为动态提供的类型

  • 1-效率是相对的。很难回答。如果对你来说足够好,那就没问题了

    2-您可以使用
    Convert.ChangeType

    public static T ParseClientRequest<T>(object data)
    {
        var t = (System.Collections.Generic.Dictionary<string, object>)data;
        T obj = (T)Activator.CreateInstance(typeof(T));
        foreach (var pair in t)
        {
            FieldInfo field = obj.GetType().GetField(pair.Key);
            field.SetValue(obj, Convert.ChangeType(pair.Value, field.FieldType)); //See this line
        }
        return obj;
    }
    
    publicstatict ParseClientRequest(对象数据)
    {
    var t=(System.Collections.Generic.Dictionary)数据;
    T obj=(T)Activator.CreateInstance(typeof(T));
    foreach(t中的var对)
    {
    FieldInfo field=obj.GetType().GetField(pair.Key);
    field.SetValue(obj,Convert.ChangeType(pair.Value,field.FieldType));//参见此行
    }
    返回obj;
    }
    
    谢谢@Eser。它起到了很好的作用不需要,但您能否告诉我如何修改此代码,以便在检测到任何
    enum
    类型字段时,将
    int
    转换为
    enum
    类型?当前它抛出
    InvalidCastException
    。但是如果不能在这个方法中完成,那也没关系。我将在调用此方法后的处理过程中转换它。但如果可能的话,采用这种方法会很好@AishwaryaShiva您需要一个
    if
    来检查类型是否为enum。您现在可以使用
    Enum.Parse
    。是的,我尝试了
    if(field.GetType().IsEnum)field.SetValue(obj,Enum.Parse(field.GetType(),pair.Value.ToString())但它不工作。该条件不是真的。@AishwaryaShiva它应该是
    字段。FieldType
    感谢它的工作,我编辑了您的代码,以便它可以允许转换
    枚举
    对象
    类型。使其成为更通用的方法。:)