【发布时间】:2015-10-28 18:19:32
【问题描述】:
我有两个扩展:
public static TModel ObjectToModel<TModel>(this object source, string[] propsToExclude = null)
where TModel : new()
{
var dest = new TModel();
source.CopyPropertiesToObject(dest, propsToExclude);
return dest;
}
public static bool CopyPropertiesToObject<T, TU>(this T source, TU dest, string[] propsToExclude = null)
{
propsToExclude = propsToExclude ?? new string[0];
var sourceProps = typeof(T).GetProperties().Cast<PropertyInfo>();
var destProps = typeof(TU).GetProperties().Cast<PropertyInfo>().Where(x => x.CanWrite && sourceProps.Any(s => s.Name == x.Name) && !propsToExclude.Any(e => e == x.Name));
// code
}
使用:
source.CopyPropertiesToObject(dest); // fine
dest = source.ObjectToModel<TModel>(); // not work
这不起作用,因为ObjectToModel 方法中的source 参数是object 类型 - 所以CopyPropertiesToObject 方法中的var sourceProps = typeof(T).GetProperties()... 返回一个空的属性列表。
如何更改ObjectToModel<TModel> 扩展才能正常工作?
【问题讨论】:
-
“不起作用”是什么意思?你能提供一些输入示例吗?
-
@IanR.O'Brien 在由
ObjectToModel调用的CopyPropertiesToObject方法中,typeof(T)将返回System.Object,而不是source变量的实际类型。因此,不会复制任何属性。 -
doesn't work because ..ObjectToModel<TModel>(this object source..这条线是什么意思?请使用完整的句子。 -
@M.kazemAkhgary 另一个用户的编辑删除了对源参数类型的强调。
-
你为什么用
typeof(T)而不是source.GetType()? GetType 将为您提供正确的对象类型,无论您传递的是基对象还是派生对象;相反,typeof(T)给出了基本类型,因此设计上是错误的。
标签: c# static-methods typeof