我有一个众所周知的POCO类客户从我的方法返回。但是,我只填充由不断变化的Expression p =>指定的属性。例如,new {p.id,p.name}作为方法的参数。
不知何故,我需要复制这两个对象之间的所有匹配字段。
var returnObject = IList<Customer>();
var partialFieldObject = DC.Customers.Select( expParameter); // wont know the fields
foreach( var partialRecord in partialFieldObject)
{ foreach (var property in partialRecord // Pseudo code)
{
returnObject[property] = property.value; // More Pseudo code
}
}
End result is a strongly typed Customer POCO returned that only has the selected fields populated with values.
答案 0 :(得分:17)
假设partialFieldObject
上的属性与Customer
上的属性完全对齐(区分大小写)...
void SetProperties(object source, object target)
{
var customerType = target.GetType();
foreach (var prop in source.GetType().GetProperties())
{
var propGetter = prop.GetGetMethod();
var propSetter = customerType.GetProperty(prop.Name).GetSetMethod();
var valueToSet = propGetter.Invoke(source, null);
propSetter.Invoke(target, new[] { valueToSet });
}
}
答案 1 :(得分:6)
你可以使用AutoMapper - 它是为了做这件事我想的
答案 2 :(得分:2)
调整dahlbyk已接受的answer,我最终在接受基类型并需要镜像内容的构造函数中使用以下内容:
var thisType = this.GetType();
foreach (var prop in baseObj.GetType().GetProperties()
.Where(p => thisType.GetProperty(p.Name) != null))
{
var propGetter = prop.GetGetMethod();
var propSetter = thisType.GetProperty(prop.Name).GetSetMethod();
if (propSetter != null)
propSetter.Invoke(this, new[] { propGetter.Invoke(baseObj, null) });
}
基本上,逐步浏览baseObj
类型中的每个属性,其中this
类型具有匹配名称的属性,并在get
类型上找到baseObj
方法以及set
类型上匹配命名属性的this
方法,如果set
上有this
方法,则使用从调用返回的方法调用它get
类型上的baseObj
方法。
适合公众和公众;两种类型上任何(匹配)类型的私有属性。
注意:您需要System.Linq
引用.Where()
func in the loop
答案 3 :(得分:1)
没有那么不同,只是我找到的最紧凑,最干净的形式:
void CopyProperties(object src, object dest) {
foreach (var source in src.GetType().GetProperties().Where(p => p.CanRead)) {
var prop = dest.GetType().GetProperty(source.Name);
if (prop?.CanWrite == true)
prop.SetValue(dest, source.GetValue(src, null), null);
}
}
答案 4 :(得分:0)
public static void CopyPropertiesTo<T, TU>(this T source, TU dest)
{
var sourceProps = typeof (T).GetProperties().Where(x => x.CanRead).ToList();
var destProps = typeof(TU).GetProperties()
.Where(x => x.CanWrite)
.ToList();
foreach (var sourceProp in sourceProps)
{
if (destProps.Any(x => x.Name == sourceProp.Name))
{
var p = destProps.First(x => x.Name == sourceProp.Name);
p.SetValue(dest, sourceProp.GetValue(source, null), null);
}
}
}
答案 5 :(得分:0)
void Copy(object copyToObject, object copyFromObject)
{
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
FieldInfo[] fields = copyFromObject.GetType().GetFields(flags);
for (int i = 0; i < fields.Length; ++i)
{
FieldInfo fromField = copyFromObject.GetType().GetField(fields[i].Name, flags);
FieldInfo toField = copyToObject.GetType().GetField(fields[i].Name, flags);
if(fromField != null)
{
toField.SetValue(copyToObject, fromField.GetValue(copyFromObject));
}
}
}