在评估语句后调用方法

时间:2013-01-25 21:32:34

标签: c# methods sharepoint-2010 optional-arguments

这应该很容易回答,但我甚至不确定如何正确地问它,所以我提前为我的n00b-ness道歉。对于没有运气的搜索,我一直在努力解释它......

基本上我有一个方法,它将几个参数作为“开关”(通过调用方法设置为0或1)和可选字符串,并使用它们来“构建”其行动计划。它是这样的:

public static void Foo(int a, int b, int c, optionalString aa, optionalString, bb, optionalString cc)
{
    if (a == 1)
    { Object1 o1 = Thing.Property1[aa]; }
    if (b == 1)
    { Object2 o2 = Thing.Property2[bb]; }
    if (c == 1)
    { Object3 o3 = Thing.Property3[cc]; }

    Bar(optionalo1, optionalo2, optionalo3); // Edit: I explained this part a little wrong, see below.
}

编辑以澄清:我无法将空值传递给Bar(),因为只需要使用实际设置的属性调用它。例如,调用Foo()时使用a,b和c设置如下:

Foo(1, 0, 1, string1, string3) //In this instance I only want the first and third properties set. The strings contain the values I want them set to.
{
    if (a == 1)
    { set this property based on string1 }
    if (b == 1)
    { this one would not be set because b was 0 }
    if (c == 1)
    { set this property based on string3 }

    Bar(property1, property3);
    // In this instance, Bar() must be called with only those two arguments, it cannot contain any null values.

编辑结束

因此,如果不对if()的每种可能组合使用嵌套的Bar()语句或方法,是否有一种方法可以在评估完所有内容后调用它?从技术上讲,尚未分配变量,因此Bar()无效。或者,有没有更好的方法来完成这样的事情?

这适用于与SharePoint服务器对象模型交互的控制台应用程序,如果这有任何区别的话。非常感谢你的时间!

3 个答案:

答案 0 :(得分:1)

也许您只想将null作为默认值传递给Bar方法,如下所示:

public static void Foo(int a, int b, int c, 
    optionalString aa, optionalString, bb, optionalString cc)
{
    Object1 o1 = null;
    Object1 o2 = null;
    Object1 o3 = null;
    if (a == 1)
    { o1 = Thing.Property1[aa]; }
    if (b == 1)
    { o2 = Thing.Property2[bb]; }
    if (c == 1)
    { o3 = Thing.Property3[cc]; }

    Bar(o1, o2, o3);
}

答案 1 :(得分:1)

您需要将代码转换为数据。你有一些输入参数,你需要对它们执行一些操作。

使用定义为Dictionary<Key, Action>的字典结构,您可以在其中创建Key = whatever unique value。然后,您在方法中所要做的就是计算密钥并执行相关操作。

从你的例子:

    public static void Foo(int a, int b, int c, optionalString aa, optionalString, bb, optionalString cc)
    {
Dictionary<int, Action> objectMapper = new Dictionary<int, Action>
        {
            { 0, () => Bar() },
            { 1, () => Bar(Thing.Property1[aa]) },
            { 2, () => Bar(Thing.Property2[bb]) },
            { 4, () => Bar(Thing.Property3[cc]) },
            { 3, () => Bar(Thing.Property1[aa], Thing.Property2[bb]) },
            { 5, () => Bar(Thing.Property1[aa], Thing.Property3[cc]) },
            { 6, () => Bar(Thing.Property2[bb], Thing.Property3[cc]) },
            { 7, () => Bar(Thing.Property1[aa], Thing.Property2[bb], Thing.Property3[cc]) },
        };    
        objectMapper[a & b & c]();
    }

在我的例子中,唯一键只是ANDing 3个输入变量。但是,如您所见,覆盖所有可能性非常繁琐,这就是为什么我不建议采用这种方式,但尝试重新设计Bar方法以便在输入参数上更灵活。

答案 2 :(得分:1)

根据Bar的签名,是的。

如果bar被声明为

public static void Bar(params string[] values) {
    foreach(var v in values) {
        // use value
    }
}

然后Foo可以构建一个数组并通过它发送,例如

var list values = new List<string>();

if(a == 1) {
    list.Add(optionalo1);
    // do whatever else
}

if(b == 1) {
    list.Add(optionalo2);
    // do whatever else
}

Bar(values.ToArray());

修改

还要记住,如果Foo被声明为

public static void Foo(int a, int b, int c, string aa = null, string bb = null, string cc = null)

你打电话就像你在你的例子中所做的那样:

Foo(1, 0, 1, string1, string3)

然后string1会在你想要的时候在string1中结束,但传递的string3将在string2中结束。

。您需要将该位置的空值传递给Foo,否则值会混淆。