如何在C#中调用方法

时间:2016-10-11 10:53:19

标签: c#

从Java我已经使用下面的代码来调用方法。传递方法所在的类的实例,然后执行。

<table>
    <tbody>
        <tr>
            <td>
                <table>
                    <tbody>
                        <tr>
                            <td>Content</td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
    </tbody>
</table>

我想在C#中转换上面的代码。我试图搜索并找到了link,但我对如何使用我已通过的实例感到困惑。到目前为止,我在C#中有以下代码。

 Context context; //Assuming the passed Instance is initialized here
 Class c = Class.forName(context.getClass().getName()); //Get the class name including it's package and initialized here
 Method m = c.getMethod("thisMethod", String.class, String.class); //Initialize the Method name and it's parameter type
 Object t = c.newInstance();    
 m.invoke(t,"data1", "data2");  //Invoke the method with 2 string

来自class Program{ static InvokerClass ic; private static Program programInstance = new Program(); static void Main(string[] args){ ic = new InvokerClass(programInstance); ic.StartInvokeExample("Hello","World!"); } //Call this method later public static void thisMethod(String data1, String data2) { Console.WriteLine("DATA1=>" + data1 + ", DATA2=>"+data2); } } class InvokerClass{ private Object objInstance; public InvokerClass(Object obj){ this.objInstance = obj; //Get the passed Instance and use this to determine the Class Name } //Do invoking here public void StartInvokeExample(String data1, String data2){ Type t = Type.GetType("? ? ?"); //I wanted to use the `objInstance` to determine the Class name ConstructorInfo cons = t.GetConstructor(Type.EmptyTypes); object classObject = cons.Invoke(new object[] { }); MethodInfo m = t.GetMethod("thisMethod"); m.Invoke(classObject, new object[] { data1, data2 }); } } 我想使用InvokerClass初始化班级名称,但我不知道如何做。到目前为止,我还不知道我是否以适当的方式做到了。

2 个答案:

答案 0 :(得分:2)

这应该适合你:

class InvokerClass
{    
    private Object objInstance;

    public InvokerClass(Object obj)
    {
        if (obj == null) throw new ArgumentNullException("obj must not be null");
        this.objInstance = obj; //Get the passed Instance and use this to determine the Class Name
    }

    //Do invoking here
    public void StartInvokeExample(String data1, String data2)
    {   
        Type t = objInstance.GetType();
        object classObject = Activator.CreateInstance(t);

        MethodInfo m = t.GetMethod("thisMethod");
        m.Invoke(classObject, new object[] { data1, data2 });
    }
}

注意:您不需要获取构造函数,只需使用Activator.CreateInstance即可。另外,请注意验证传递的对象不为null,以避免在尝试调用NullReferenceÈxception时出现objInstance.GetType()

答案 1 :(得分:0)

您可以传入对象实例,但我可能会将其更改为使用泛型。虽然您传递的是程序对象,但这样做会提供更多的灵活性,因为您不需要实例化对象来创建新对象。你也可以创建一个重载并获得两者。在您的示例中,我将方法更改为静态,因为您不需要示例中的实例化对象。

class Program
{
  private static Program programInstance = new Program();

  static void Main(string[] args)
  {
    InvokerClass.StartInvokeExample<Program>("Hello", "World!");


  }

  public static void thisMethod(String data1, String data2)
  {
    Console.WriteLine("DATA1=>" + data1 + ", DATA2=>" + data2);
  }
}

class static InvokerClass
{

  //Do invoking here
  public void StartInvokeExample<T>(String data1, String data2) 
    where T : new()
  {

    Type t = typeof(T); 
    ConstructorInfo cons = t.GetConstructor(Type.EmptyTypes);
    object classObject = cons.Invoke(new object[] { });

    MethodInfo m = t.GetMethod("thisMethod");
    m.Invoke(classObject, new object[] { data1, data2 });


  }

  public static StartInvokeExample
   (Type t, String data1, String data2)
  {
    ConstructorInfo cons = t.GetConstructor(Type.EmptyTypes);
    object classObject = cons.Invoke(new object[] { });

    MethodInfo m = t.GetMethod("thisMethod");
    m.Invoke(classObject, new object[] { data1, data2 });
  }


}