是否可以将其重构为单一方法

时间:2010-11-22 14:19:29

标签: c#

我有一堆看起来像这两个的方法:

   public void SourceInfo_Get()    
   {
        MethodInfo mi = pFBlock.SourceInfo.GetType().GetMethod("SendGet");
        if (mi != null)
        {
            ParameterInfo[] piArr = mi.GetParameters();
            if (piArr.Length == 0)
            {
                mi.Invoke(pFBlock.SourceInfo, new object[0]);
            }
        }
    }
    public void SourceAvailable_Get()
    {
        MethodInfo mi = pFBlock.SourceAvailable.GetType().GetMethod("SendGet");
        if (mi != null)
        {
            ParameterInfo[] piArr = mi.GetParameters();
            if (piArr.Length == 0)
            {
                mi.Invoke(pFBlock.SourceAvailable, new object[0]);
            }
        }
    }

我的pFBlock对象中的每个属性都有一个方法。在方法之间变化如此之少,我觉得应该有更好的方法来做到这一点,但我想不出任何方法。 我正在使用VS 2005。

5 个答案:

答案 0 :(得分:7)

3种方法怎么样?

public void SourceInfo_Get()    
{
    SendGet(pFBlock.SourceInfo);
}

public void SourceAvailable_Get()
{
    SendGet(pFBlock.SourceAvailable);
}

private void SendGet(Object obj) {
    MethodInfo mi = obj.GetType().GetMethod("SendGet");
    if (mi != null)
    {
        ParameterInfo[] piArr = mi.GetParameters();
        if (piArr.Length == 0)
        {
            mi.Invoke(obj, new object[0]);
        }
    }
}

这里的想法是添加一个可以将参数传递给的辅助方法。然后,您可以在其他方法中使用辅助方法来大幅缩短代码。

答案 1 :(得分:0)

你可以重构像这样的重复代码

private void Source_Get( Object source )
    {
        MethodInfo mi = source.GetType().GetMethod("SendGet");
        if (mi != null)
        {
            ParameterInfo[] piArr = mi.GetParameters();
            if (piArr.Length == 0)
            {
                mi.Invoke(source, new object[0]);
            }
        }
    }

public void SourceInfo_Get()
    {
       Source_Get(pFBlock.SourceInfo);
    }

public void SourceAvailable_Get()
    {
       Source_Get(pFBlock.SourceAvailable)
    }

答案 2 :(得分:0)

public void SourceAvailable_Get()
{
    CallMethod(pFBlock.SourceAvailable);
}

private void CallMethod(object source, String methodName = "SendGet")
{
   MethodInfo mi = source.GetType().GetMethod(methodName);
   if (mi != null)
   {
        if (mi.GetParameters().Length == 0)
        {
           mi.Invoke(source, new object[0]);
        }
   }
}

或我们使用动态...

public void CallSendGet(object obj)
{
    obj.AsDynamic().SendGet();
}

答案 3 :(得分:0)

    public void Source_Get(string memberName)
    {
        object member = pFBlock.GetMember(memberName);
        MethodInfo mi = member.GetType().GetMethod("SendGet");
        if (mi != null)
        {
            ParameterInfo[] piArr = mi.GetParameters();
            if (piArr.Length == 0)
            {
                mi.Invoke(member, new object[0]);
            }
        }
    }

有时,分离的函数使代码更具可读性。你不应该尽可能地合并你的功能。

答案 4 :(得分:0)

试试这个。键入未测试。

private void MasterGet(PFBlock pFBlock, string propertyName)
{
    Type t = pFBlock.GetType();

    // Cycle through the properties.
    foreach (PropertyInfo p in t.GetProperties())
    {
         if(p.Name == propertyName)
         {
           MethodInfo mi = p.GetType().GetMethod("SendGet");
              if (mi != null)
              {
                 ParameterInfo[] piArr = mi.GetParameters();
                 if (piArr.Length == 0)
                  {
                      mi.Invoke(p, new object[0]);
                  }
              }
         }
    }
}