26

インスタンスを作成し、その関数を動的に実行するプロセスを自動化するにはどうすればよいですか?

ありがとう

編集:パラメーターを渡すオプションも必要です。ありがとう

4

5 に答える 5

49

パラメーターなしのコンストラクターを呼び出してインスタンスを作成したいだけですか? 型も文字列指定ですか、それともジェネリックメソッドにできますか?例えば:

// All error checking omitted. In particular, check the results
// of Type.GetType, and make sure you call it with a fully qualified
// type name, including the assembly if it's not in mscorlib or
// the current assembly. The method has to be a public instance
// method with no parameters. (Use BindingFlags with GetMethod
// to change this.)
public void Invoke(string typeName, string methodName)
{
    Type type = Type.GetType(typeName);
    object instance = Activator.CreateInstance(type);
    MethodInfo method = type.GetMethod(methodName);
    method.Invoke(instance, null);
}

また

public void Invoke<T>(string methodName) where T : new()
{
    T instance = new T();
    MethodInfo method = typeof(T).GetMethod(methodName);
    method.Invoke(instance, null);
}
于 2009-04-29T06:11:20.767 に答える
21

コンストラクターを呼び出すには、Activator.CreateInstanceがそのトリックを行います。あなたの人生を楽にするためのオーバーロードがたくさんあります。

コンストラクターがパラメーターなしの場合:

object instance = Activator.CreateInstance(type)

パラメータが必要な場合:

object instance =  Activator.CreateInstance(type, param1, param2)

メソッドを呼び出すには、TypeオブジェクトGetMethodを取得したら、メソッドを呼び出してメソッドを取得し、Invoke(パラメータの有無にかかわらず) メソッドを呼び出します。必要に応じて、Invoke は呼び出している関数の戻り値 (void メソッドの場合は null) も返します。

もう少し詳細なサンプル (コンソール アプリに貼り付けて実行):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Test
{
    public static class Invoker
    {
        public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs)
        {
            Type type = Type.GetType(typeName);
            object instance = Activator.CreateInstance(type, constructorArgs);

            MethodInfo method = type.GetMethod(methodName);
            return method.Invoke(instance, methodArgs);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Default constructor, void method
            Invoker.CreateAndInvoke("Test.Tester", null, "TestMethod", null);

            // Constructor that takes a parameter
            Invoker.CreateAndInvoke("Test.Tester", new[] { "constructorParam" }, "TestMethodUsingValueFromConstructorAndArgs", new object[] { "moo", false });

            // Constructor that takes a parameter, invokes a method with a return value
            string result = (string)Invoker.CreateAndInvoke("Test.Tester", new object[] { "constructorValue" }, "GetContstructorValue", null);
            Console.WriteLine("Expect [constructorValue], got:" + result);

            Console.ReadKey(true);
        }
    }

    public class Tester
    {
        public string _testField;

        public Tester()
        {
        }

        public Tester(string arg)
        {
            _testField = arg;
        }

        public void TestMethod()
        {
            Console.WriteLine("Called TestMethod");
        }

        public void TestMethodWithArg(string arg)
        {
            Console.WriteLine("Called TestMethodWithArg: " + arg);
        }

        public void TestMethodUsingValueFromConstructorAndArgs(string arg, bool arg2)
        {
            Console.WriteLine("Called TestMethodUsingValueFromConstructorAndArg " + arg + " " + arg2 + " " + _testField);
        }

        public string GetContstructorValue()
        {
            return _testField;
        }
    }
}
于 2009-06-17T04:08:24.917 に答える
7

呼び出したいメソッドがパラメーターを取らないと仮定します。

public void InvokeMethod(Type type, string methodName)
{
    object instance = Activator.CreateInstance(type);
    MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

    method.Invoke(instance, null);
}
于 2009-04-29T06:11:35.570 に答える
3

あなたの問題はここではあまり一般的ではないと思います。ここでは、特定の仮定で解決策を提供しています。

前提: typeName (文字列)、methodName (文字列)、および (SomeType の) パラメーターがあります。

public static void InvokeMethod(string typeName, string methodName, SomeType objSomeType) {
      Type type = Type.GetType(typeName);
      if(type==null) {
        return;
      }
      object instance = Activator.CreateInstance(type); //Type must have a parameter-less contructor, or no contructor.   
      MethodInfo methodInfo =type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
      if(methodInfo==null) {
        return;
      }
      methodInfo.Invoke(instance, new[] { objSomeType });  
    } 

私の仮定が間違っているかどうか教えてください。

于 2009-04-29T07:18:39.733 に答える
3

パラメータを動的に渡すには ここでは params string[] args を使用しています。これは、関数によってパラメータの数が異なるためです。

public void Invoke(string typeName,string functionName,params string[] args)
    {

     Type type = Type.GetType(typeName);
     dynamic c=Activator.CreateInstance(type);
     //args contains the parameters(only string type)
     type.InvokeMember(functionName,BindingFlags.InvokeMethod,null,c,args);   

    }
于 2016-10-03T09:36:01.093 に答える