1

可能であれば、文字列に基づいてクラスが存在するかどうかを確認し、そのクラスが存在する場合はそのオブジェクトの新しいインスタンスを取得する方法を教えてください。

ここには、オブジェクトにメソッドがあるかどうかをチェックするこのメソッドがあります。

public static bool HasMethod(object objectToCheck, string methodName)
{
    Type type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

その後、メソッドが取るパラメーターをどのように確認できますか?

これはすべて可能ですか?


答え

クラスを取得するには:

public T GetInstance<T>(string namespace, string type)
{
    return (T)Activator.CreateInstance(Type.GetType(namespace + "." + type));
}

メソッドを取得するには:

public static bool HasMethod(object objectToCheck, string methodName)
{
    Type type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

...

dynamic controller = GetInstance<dynamic>(controllerString);
if (HasMethod(controller, actionString))
{
    controller.GetType().GetMethod(actionString);
}

パラメータを取得するには

MethodInfo mi = type.GetMethod(methodName);
if (mi != null)
{
    ParameterInfo[] parameters = mi.GetParameters();
    // The parameters array will contain a list of all parameters
    // that the method takes along with their type and name:
    foreach (ParameterInfo parameter in parameters)
    {
        string parameterName = parameter.Name;
        Type parameterType = parameter.ParameterType;
    }
}
4

2 に答える 2

2

GetParametersメソッドで取得した MethodInfo インスタンスでメソッドを使用できますGetMethod

例えば:

MethodInfo mi = type.GetMethod(methodName);
if (mi != null)
{
    ParameterInfo[] parameters = mi.GetParameters();
    // The parameters array will contain a list of all parameters
    // that the method takes along with their type and name:
    foreach (ParameterInfo parameter in parameters)
    {
        string parameterName = parameter.Name;
        Type parameterType = parameter.ParameterType;
    }
}
于 2013-02-09T14:25:48.220 に答える
1

メソッドを取得する方法をすでに理解しているようです。パラメータの取得も、MethodInfo.GetParameters を使用して簡単に行うことができます。

ただし、ここでは、メソッドを呼び出す前にメソッドのシグネチャを確認する必要があると推測しています。メソッドに次のような署名がある場合、メソッドにオプションまたはジェネリック パラメーターがある可能性があることに注意する必要があります。

    // Accepts 'Test(12345);' and implicitly compiles as 'Test<int>(12345)'
    public void Test<T>(T foo) { /* ... */ }

また

    // Accepts signatures for 'Test(string)' and 'Test()' in your code
    public void Test(string foo = "") { /* ... */ }

また、.NET は、メソッドを呼び出すときに、暗黙的な変換と、共分散や継承などを処理します。たとえば、バイト パラメーターを指定して Foo(int) を呼び出すと、.NET は呼び出す前にバイトを int に変換します。つまり、ほとんどのメソッド シグネチャは多くのパラメータ タイプを受け入れます。

メソッドの呼び出しも、思ったほど簡単ではないかもしれません。GetParameters() を使用して ParameterInfo オブジェクトを取得し、「IsOptional」フラグが設定されているかどうかを確認します。(下記参照)

署名を確認する最も簡単な方法は、MethodInfo.Invoke を使用して単純に呼び出すことです。GetParameters のパラメーターと同じ数の引数がある場合 -> 呼び出します。それ以外の場合は、IsOptional を確認します。そうである場合は、'DefaultValue' を使用して既定値があるかどうかを確認します。それ以外の場合は、型の既定値 (クラス型の場合は null、値型の場合は既定の ctor) を使用します。

難しい方法は、オーバーロードの解決を手動で行うことです。これを実装する方法については、かなりの量をここに書いています: Get best matching overloads from set of overloads

于 2013-02-09T14:38:27.587 に答える