对C#中具有不同签名的方法使用Func而不是switch

时间:2016-12-07 11:45:38

标签: c#

我试图在C#中重构switch case语句。 我使用了以下代码,它运行良好。但现在我必须改变代码。一种方法具有不同的签名[它没有参数],而其他方法采用一个参数。 有人可以帮我修改具有不同签名的方法的代码吗?

Dictionary<string, Func<SqlDataReader, object>> methods = new Dictionary<string, Func<SqlDataReader, object>>();
methods = LoadMethodNames();
return methods[key].Invoke(reader); // key = A or B

private Dictionary<string, Func<SqlDataReader, object>> LoadMethodNames()
{
    Dictionary<string, Func<SqlDataReader, object>> s= new Dictionary<string, Func<SqlDataReader, object>>();
    s.Add("A", A);
    s.Add("B", B); return s; }


private object A(SqlDataReader reader)
{
    return new object; 
}

private object B(SqlDataReader reader)
{
    return new object; 
}

现在改变是在方法B

private object B() { return new object; }

1 个答案:

答案 0 :(得分:0)

你可以通过额外的间接水平实现这一目标;简单地将没有参数的调用包装在一个带有将被忽略的参数的调用中:

s.Add("B", reader => B());

如有必要,您可以添加一个安全网,确保传入的阅读器为null

s.Add("B", reader => { Debug.Assert(reader == null); return B(); });

请记住,这简直就是黑客攻击。如果您期望频繁的签名变化,那么您必须重新考虑您的策略,因为当前的解决方案不会削减它;没有一个共同的Func可以代表具有不同签名的代表。