我有一堆看起来像这两个的方法:
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。
答案 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]);
}
}
}
}
}