基本上我有一个方法,它接受一个对象并根据传入的对象设置另一个对象属性。
e.g:
private void SetObject(MyClass object)
{
MyClass2 object2 = new MyClass2();
object2.Property1 = HelperClass.Convert(object.Property1);
//....
// Lots more code ....
//....
}
现在该方法长53行,因为有很多属性需要设置。这个方法对我来说似乎太长了,但我正在努力弄清楚我怎么可能分解它。
一种选择是尝试对相似的属性进行分组,并将对象作为对设置这些相似属性的不同方法的引用传递,但这似乎并不适合我。
或者我可以为MyClass2创建一个接受MyClass1的构造函数,但这似乎也不对。
无论如何会欢迎一些建议。
编辑:好的谢谢你的回复,我必须提供更多信息,属性名称不一样,我也必须调用一些转换方法。由于这一点以及性能受到影响,反思不会很好。 Automapper我认为原因相同。代码的一个真实示例:
private ReportType GetReportFromItem(SPWeb web, SPListItem item)
{
ReportType reportType = new ReportType();
reportType.ReportID = int.Parse(item["Report ID"].ToString());
reportType.Name = item["Title"].ToString();
reportType.SourceLocation = FieldHelpers.GetUri(item["Source Location"]);
reportType.TargetLocation = FieldHelpers.GetUri(item["Document Library"]);
SPFieldUserValue group1 =
new SPFieldUserValue(web, FieldHelpers.GetStringFieldValue(item, "Security Group 1"));
reportType.SecurityGroup1 = group1.LookupValue;
SPFieldUserValue group2 =
new SPFieldUserValue(web, FieldHelpers.GetStringFieldValue(item, "Security Group 2"));
reportType.SecurityGroup2 = group2.LookupValue;
SPFieldUserValue group3 =
new SPFieldUserValue(web, FieldHelpers.GetStringFieldValue(item, "Security Group 3"));
reportType.SecurityGroup3 = group3.LookupValue;
SPFieldUserValue group4 =
new SPFieldUserValue(web, FieldHelpers.GetStringFieldValue(item, "Security Group 4"));
// More code
//...
//...
}
答案 0 :(得分:2)
听起来像是AutoMapper
的工作答案 1 :(得分:0)
使用反射来做到这一点。可能有这样的方法:
private void SetProperties<T>(List<T> objects, List<Tuple<string, object>> propsAndValues) where T:<your_class>
{
Type type = typeof(T);
var propInfos = propsAndValues.ToDictionary(key => type.GetProperty(key.Item1, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.SetProperty), elem => elem.Item2);
objects.AsParallel().ForAll(obj =>
{
obj.SetProps(propInfos);
});
}
public static void SetProps<T>(this T obj, Dictionary<PropertyInfo, object> propInfos) where T : <your_class>
{
foreach (var propInfo in propInfos)
{
propInfo.Key.SetValue(obj, propInfo.Value, null);
}
}
答案 2 :(得分:0)