C# 将对象解析为动态提供的类型
我在C#中使用了以下通用方法,将ASP.NET web表单应用程序中的客户端数据解析为某种定义类型: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
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;
}
我有两个问题:
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
感谢它的工作,我编辑了您的代码,以便它可以允许转换枚举
和对象
类型。使其成为更通用的方法。:)