1

変数の内容に基づいてメソッドをどのように呼び出すか

元。

String S = "Hello World";
String Format = "ToUpper()";

String sFormat = s.Format;

resulting in "HELLO WORLD"

このようにして、別の時点でFormat = "ToLower()"、pos1から始まる4文字を削除するFormat= "Remove(1,4)"を渡すことができます。つまり、任意の文字列メソッドを呼び出す機能が必要です。

誰かが完全に機能するソリューションを投稿できますか?

4

6 に答える 6

1

ソリューションの核心は、リフレクションを使用して必要なメソッドを見つける必要があることです。これはあなたの状況をカバーする簡単な例です。

private string DoFormat(string data, string format)
{
    MethodInfo mi = typeof (string).GetMethod(format, new Type[0]);
    if (null == mi)
        throw new Exception(String.Format("Could not find method with name '{0}'", format));

    return mi.Invoke(data, null).ToString();
}

以下のように、メソッドをより汎用的にして、呼び出したいメソッドへの引数を受け入れることができます。必要な引数を渡すために .GetMethod と .Invoke を呼び出す方法が変更されていることに注意してください。

private static string DoFormat(string data, string format, object[] parameters)
{
    Type[] parameterTypes = (from p in parameters select p.GetType()).ToArray();

    MethodInfo mi = typeof(string).GetMethod(format, parameterTypes);
    if (null == mi)
        throw new Exception(String.Format("Could not find method with name '{0}'", format));

    return mi.Invoke(data, parameters).ToString();
}
于 2012-07-24T02:54:55.823 に答える
1

リフレクションでこれを行うことはできますが、コードが読みにくくなり、型の安全性が失われます。

C# は、実行可能コードを渡すためのはるかに優れたメカニズム、つまりデリゲートを提供します。

次のようなことができます。

void ShowConverted(string str, Func<string,string> conv) {
    Console.WriteLine("{0} -- {1}", str, conv(str));
}

Func<string,string> strAction1 = (s) => s.ToUpper();
Func<string,string> strAction2 = (s) => s.ToLower();
ShowConverted("Hello, world!", stringAction1);
ShowConverted("Hello, world!", stringAction2);
于 2012-07-24T02:56:54.577 に答える
1

リフレクションを使用して、文字列型から ToLower() メソッドをプルできます。

  string format = "Hello World";
  MethodInfo methodInfo = typeof(string).GetMethod("ToLower");
  string result = methodInfo.Invoke(format,null);

構文を少し混乱させた可能性があります

于 2012-07-24T02:57:20.533 に答える
0

メソッド自体を使用しないのはなぜですか。

Func<string, string> format = s = > s.ToUpper();

そして、あなたはできる

format = s = > s.ToLower();

それ以外の場合は、安全ではなく、おそらく遅いリフレクションを使用する必要があります。

于 2012-07-24T02:54:36.030 に答える
0

ここでリフレクションを利用できます。MethodInfoクラスを見てください。

于 2012-07-24T02:55:30.413 に答える
0

このようなものは機能しますが、検証するコンパイラが目の前にありません。

次のように使用します。

var result = someObject.CallParameterlessMethod("ToUpper");




public static class ObjectExtensionMethods
{
  public static object CallParameterlessMethod(this object obj, string methodName)
  {
    var method = typeof(obj).GetMethod(methodName);
    return method.Invoke(obj,null);
  }
}
于 2012-07-24T02:56:33.657 に答える