我该如何重构这个C#代码

时间:2011-08-19 07:54:02

标签: c# refactoring

基本上我有一个方法,它接受一个对象并根据传入的对象设置另一个对象属性。

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
//...
//...
}

3 个答案:

答案 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)