【问题标题】:Parse object to a dynamically supplied type将对象解析为动态提供的类型
【发布时间】:2015-08-24 12:00:09
【问题描述】:

我在 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;
}

我有两个问题:

  1. 有没有不使用循环的有效方法(使用 LINQ 或其他方法)?或者它是否足够高效?
  2. 如果类型的字段之一是字符串以外的类型,则代码将引发异常。如何将对象类型解析为动态提供的类型?

【问题讨论】:

    标签: c# asp.net .net linq generics


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 谢谢@Eser。它就像一个魅力。 :) 没有必要,但你能告诉我如何修改此代码,以便在检测到任何enum 类型字段时将int 转换为enum 类型?目前它抛出InvalidCastException。但是如果不能在这个方法里面完成也没关系。我将在调用此方法后的处理过程中对其进行转换。但如果可能在这种方法中,那将是伟大的。 :)
    • @AishwaryaShiva 您需要if 来检查类型是否为枚举。您现在可以使用Enum.Parse
    • 是的,我试过这个if (field.GetType().IsEnum) field.SetValue(obj, Enum.Parse(field.GetType(), pair.Value.ToString()));,但它不起作用。条件不成立。
    • @AishwaryaShiva 应该是field.FieldType
    • 感谢它有效,我编辑了您的代码,以便它可以转换 enumobject 类型。使其成为更通用的方法。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多