C #에서 문자열에서 함수 호출


145

PHP에서 다음과 같이 전화를 걸 수 있다는 것을 알고 있습니다.

$function_name = 'hello';
$function_name();

function hello() { echo 'hello'; }

.Net에서 가능합니까?


2
나는 당신의 방법도 있어야한다는 것을 알았습니다 public.
zapoo

답변:


268

예. 반사를 사용할 수 있습니다. 이 같은:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

56
그리고 이것은 "System.Reflection 사용"을 요구합니다;
jptsetung

1
매개 변수로 함수를 호출하는 데 사용될 수도 있습니다. 예 : string f = "method (parameter1, parameter2)";
Thunder

답변 주셔서 감사합니다 @ottobar. 이것이 또한 내가 찾고있는 것인지 모르겠습니다. 내 C # 코드에서 SQL 스칼라 함수를 사용해야했습니다. 어떻게 부르나요?
Chagbert

1
참고로 오버로드 된 메소드가 있으면 작동하지 않습니다.
Sean O'Neil

위의 코드-호출 된 메소드에는 액세스 수정 자 (PUBLIC)가 있어야합니다. 비공개 인 경우 바인딩 플래그를 사용하십시오-BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Sibgath

75

리플렉션을 사용하여 동적 메소드 호출을 수행하여 클래스 인스턴스의 메소드를 호출 할 수 있습니다.

실제 인스턴스에 hello라는 메소드가 있다고 가정합니다 (this).

string methodName = "hello";

//Get the method information using the method info class
 MethodInfo mi = this.GetType().GetMethod(methodName);

//Invoke the method
// (null- no parameter for the method call
// or you can pass the array of parameters...)
mi.Invoke(this, null);

1
"문자열"클래스의 메소드는 어떻습니까? 프레임 워크 4 사용
Leandro

36
class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(MyReflectionClass);
            MethodInfo method = type.GetMethod("MyMethod");
            MyReflectionClass c = new MyReflectionClass();
            string result = (string)method.Invoke(c, null);
            Console.WriteLine(result);

        }
    }

    public class MyReflectionClass
    {
        public string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }

이것은 클래스에 의존하지 않습니다
Leandro

그리고 메소드 void?
Kiquenet

2

약간의 접선-(중첩 된) 함수를 포함하는 전체 표현식 문자열을 구문 분석하고 평가하려면 NCalc ( http://ncalc.codeplex.com/ 및 nuget)를 고려하십시오.

전의. 프로젝트 문서에서 약간 수정되었습니다.

// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students)
var exprStr = "10 + MyFunction(3, 6)";
Expression e = new Expression(exprString);

// tell it how to handle your custom function
e.EvaluateFunction += delegate(string name, FunctionArgs args) {
        if (name == "MyFunction")
            args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate();
    };

// confirm it worked
Debug.Assert(19 == e.Evaluate());

EvaluateFunction델리게이트 내에서 기존 함수를 호출합니다.


0

사실 Windows Workflow 4.5에서 작업 중이며 상태 머신에서 메서드로 대리자를 성공하지 않고 전달하는 방법을 찾았습니다. 내가 찾은 유일한 방법은 대리자로 전달하려는 메서드 이름으로 문자열을 전달하고 문자열을 메서드 내부의 대리자로 변환하는 것입니다. 아주 좋은 답변입니다. 감사. 이 링크를 확인하십시오 https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx


0
이 코드는 내 콘솔 .Net 응용 프로그램에서 작동합니다.
class Program
{
    static void Main(string[] args)
    {
        string method = args[0]; // get name method
        CallMethod(method);
    }
    
    public static void CallMethod(string method)
    {
        try
        {
            Type type = typeof(Program);
            MethodInfo methodInfo = type.GetMethod(method);
            methodInfo.Invoke(method, null);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            Console.ReadKey();
        }
    }
    
    public static void Hello()
    {
        string a = "hello world!";
        Console.WriteLine(a);
        Console.ReadKey();
    }
}

SO에 오신 것을 환영합니다! 나는 당신의 대답을 좋아합니다, 당신이하고있는 것에 대해 조금 더 설명해 주시겠습니까?
a.deshpande012

안녕하세요, 물론입니다. 이것은 "프로그램 클래스"안에 콘솔, .net 어플리케이션입니다. hello, hello2, hello2와 같은 몇 가지 메소드 나 함수가 있습니다. "CallMethod (string method)"메소드는 이름을 호출하여 "프로그램 클래스"내부의 메소드를 문자열 매개 변수로 호출하도록합니다. "Windows Console"에서 응용 프로그램을 실행할 때 : "name app"+ "method 호출해야합니다"라고 씁니다. 예를 들어, myapp hello를 입력 한 다음 "hello world!"를 리턴하십시오. "myapp hello2"또는 "myapp hello3"일 수도 있습니다. 나는 모든 .Net 응용 프로그램에서 작동 할 수 있다고 생각합니다.
ranobe

Reflection 클래스를 추가해야합니다 : "using System.Reflection;".
ranobe

-9

C #에서는 대리자를 함수 포인터로 만들 수 있습니다. 사용법에 대한 정보는 다음 MSDN 기사를 확인하십시오.http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx

    public static void hello()
    {
        Console.Write("hello world");
    }

   /* code snipped */

    public delegate void functionPointer();

    functionPointer foo = hello;
    foo();  // Writes hello world to the console.

15
이것은 문자열이 아닙니다!
nawfal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.