Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重构此代码?_C#_.net_Refactoring - Fatal编程技术网

C# 如何重构此代码?

C# 如何重构此代码?,c#,.net,refactoring,C#,.net,Refactoring,如何将代码重构为一种方法或其他方法 if (!string.IsNullOrEmpty(_gridModel.Header)) _gridModel.Header += ","; if (item != null) _gridModel.Header += item.Header; if (!string.IsNullOrEmpty(_gridModel.Wi

如何将代码重构为一种方法或其他方法

            if (!string.IsNullOrEmpty(_gridModel.Header))
                _gridModel.Header += ",";
            if (item != null)
                _gridModel.Header += item.Header;

            if (!string.IsNullOrEmpty(_gridModel.Width))
                _gridModel.Width += ",";
            if (item != null)
                _gridModel.Width += item.Width;

            if (!string.IsNullOrEmpty(_gridModel.Align))
                _gridModel.Align += ",";
            if (item != null)
                _gridModel.Align += item.Align;

            if (!string.IsNullOrEmpty(_gridModel.Filter))
                _gridModel.Filter += ",";
            if (item != null)
                _gridModel.Filter += item.Filter;

            if (!string.IsNullOrEmpty(_gridModel.Type))
                _gridModel.Type += ",";
            if (item != null)
                _gridModel.Type += item.Type;

            if (!string.IsNullOrEmpty(_gridModel.Sort))
                _gridModel.Sort += ",";
            if (item != null)
                _gridModel.Sort += item.Sort;

首先,将逻辑重构为函数

_gridModel.Header = AppendItem(_gridModel.Header, item == null ? null : item.Header);
_gridModel.Width = AppendItem(_gridModel.Width, item == null ? null : item.Width);
...
...

string AppendItem(string src, string item)
{
 if (! string.IsNullOrEmpty(src))
  src += ",";
 if (! string.IsNullOrEmpty(item))
  src += item;
 return src;
}
一个好的下一步可能是使用反射和属性:

编辑:充实了反射解决方案,但实际上还没有调试它

AppendProperties(_gridModel, item, "Header", "Width", "Align", ...)

void AppendProperty(object gridmodel, object item, params string[] propNames)
{
    foreach (string propName in propNames)
        AppendProperties(gridmodel, item, propName);
}

void AppendProperties(object gridmodel, object item, string propName)
{
    PropertyInfo piGrid = gridmodel.GetType().GetProperty(propName);
    if (piGrid != null && piGrid.PropertyType == typeof(string))
    {
        piGrid.SetValue(gridmodel, 
            piGrid.GetValue(gridmodel, null).ToString() + ",", null);
    }

    if (item == null) return;
    PropertyInfo piItem = item.GetType().GetProperty(propName);
    if (piItem != null)
    {
        piGrid.SetValue(gridmodel, 
            piGrid.GetValue(gridmodel, null).ToString() 
            + piItem.GetValue(item, null).ToString(), 
            null);
    }
}

假设您有.NET 3.5:

string Filter(string input, SomeType item, Func<SomeType, string> extract)
{
    if (!String.IsNullOrEmpty(input))
    {
        if (item == null) return ",";
        else return "," + extract(item);
    }
}

_gridModel.Header += Filter(_gridModel.Header, item, i => i.Header);
_gridModel.Width += Filter(_gridModel.Width, item, i => i.Width);
_gridModel.Align += Filter(_gridModel.Align, item, i => i.Align);

// etc...
字符串过滤器(字符串输入、SomeType项、函数提取)
{
如果(!String.IsNullOrEmpty(输入))
{
如果(item==null)返回“,”;
否则返回“,”+摘录(项目);
}
}
_gridModel.Header+=过滤器(_gridModel.Header,item,i=>i.Header);
_gridModel.Width+=过滤器(_gridModel.Width,item,i=>i.Width);
_gridModel.Align+=过滤器(_gridModel.Align,item,i=>i.Align);
//等等。。。

+1如果足够接近,我可能会使用(ref string src,…)而不返回值。速度会更快,但我倾向于在可能的情况下默认无副作用。AppendItem(_gridModel.Header,item.Header);我喜欢你的第一步,我认为它实际上比公认的答案更好。然而,在我看来,在这个上下文中使用反射和魔法字符串是过分的。Freddy:调用函数时,为item添加的检查为null,谢谢。完美!——正如我所期待的那样,有这么多的附件,使用StringBuilderRoh可能会给你带来更好的性能是的,如果它在循环中,传递stringbuilder而不是串联可能更有意义。