功能参数接受一切

时间:2016-02-22 20:42:09

标签: c# .net

我对C#很陌生,并且想知道是否可以将某些内容传递给每次都未定义/不同的函数,如下例所示;

string stringexam = "string"

int intexam = 5;

bool exam = false;

等。

Myfunction(stringexam);

Myfunction(intexam);

Myfunction(exam);

public static void MyFunction(accepteverything) {

//DO SOMETHING

}

怎样才能实现这样的目标? 我需要这个,因为我可以在我的代码中使用这样的东西:

MyFunction(1,"ok example 1");
MyFunction(2, 22);
MyFunction(3, false);

然后我可以继续使用MyFunction:

MyFunction(int method, accepteverything?!) 
{
    if(method == 1) {
      ContinueExample1(string accepteverything); // CALLS FUNCTION CONTINUEEXAMPLE1 WHICH NEEDS A STRING AS PARAMETER
    } 
    if(method == 2) {
       ContinueExample2(int accepteverything); // CALLS FUNCTION CONTINUEEXAMPLE2 WHICH NEEDS A INT AS PARAMETER
    }
    if(method == 3) {
       ContinueExample3(bool accepteverything);
    }
}

4 个答案:

答案 0 :(得分:4)

您可以使用方法重载,相同的命名函数但使用不同的参数类型来完成它。

void MyFunction(string accepteverything) 
{
    ContinueExample1(accepteverything);
}
void MyFunction(int accepteverything) 
{
    ContinueExample2(accepteverything);
}
void MyFunction(bool accepteverything) 
{
    ContinueExample3(accepteverything);
}

这可以让你做到

string stringexam = "string"
int intexam = 5;
bool exam = false;

MyFunction(stringexam);
MyFunction(intexam);
MyFunction(exam);

答案 1 :(得分:1)

如果方法的行为是相同的,无论传递什么类型,你都可以很容易地制作方法:

public void MyFunction(int method, object acceptEverything)
{
    switch(method)
    {
        case 1: ContinueExample1(acceptEverything as string);
                break;

        case 2: ContineExample2(acceptEverything as int);
                break;
        // etc.
    }
}

不幸的是,这会引入很多拳击和拆箱。

答案 2 :(得分:1)

您也可以使用通用功能。这也避免了装箱/拆箱

public void MyFunction<T>(int method, T acceptEverything)
{
    switch(method)
    {
        case 1: ContinueExample1(acceptEverything as string); //String parameter
                break;

        case 2: ContineExample2(Convert.ToInt32(acceptEverything)); //int parameter 
                break;
        // etc.
    }
}

像这样打电话

MyFunction(1,stringexam);
MyFunction(2,intexam);

答案 3 :(得分:0)

当然,你可以。但是你可能想重新思考一下你做事的方式。想要减少你必须编写的代码是好的。

  
    比尔盖茨 - &#39;我选择一个懒惰的人来做一份艰苦的工作。因为懒惰的人会找到一种简单的方法。&#39;

  

但它并不总是必要的,并且可以将不必要的复杂性引入其他简单且不言自明的东西。

考虑一下代码中发生了什么。你有一个考试,你想做什么。据推测,您担心可能有多种方法可以为不同的用户识别特定的考试。但是,无论你想做什么,都可能不会改变。所以,让我们从这个角度进行攻击:我们需要能够在给出一些未知参数的情况下识别考试。

public Exam FindExamFromAnything(object input)
{
    int examID = 0;
    if (int.TryParse(input.ToString(), out examID))
    {
        return GetExamFromID(examID);
    }
    else
    {
        return GetExamFromName(input.ToString());
    }

}


public Exam GetExamFromID(int ID)
{
    // get the Exam with the right ID from a database or something
}

public Exam GetExamFromName(string examName)
{
    // get the Exam with the right name from a database
}

现在你已经有了一种可以通过任何方法的方法,而且你会找回你想要的东西。太好了!

除了......两年后,有人会有一份参加考试的学生名单,并尝试使用你的方法:

List<string> students = new List<string> {"Alice","Bob"};
var exam = FindExamFromAnything(students); // nope!

不起作用。但他怎么会知道?签名中没有任何内容指定要用作对象的内容。现在,他必须找到您的源代码,或使用反复试验来弄清楚如何使用您的API。您的文档可能会解释它只需要一个int或一个字符串,但是......

相反,编写第二种方法并不是那么多。作为Scott Chamberlain points out,您可以重载方法名称以使用不同的参数。对于此实现的更好的解决方案是为了更具体;我偏爱上面暴露的方法,即暴露你的GetExamFromStringGetExamFromID以及你需要的任何其他内容,因此它们是自我解释的。