2016-10-11 19 views
0

Javaから以下のコードを使用してメソッドを呼び出しました。メソッドがあるクラスのインスタンスを渡してから実行します。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 

私は上記のコードをC#で変換したいと思います。私は検索しようとしましたが、このlinkが見つかりました。私が渡したインスタンスをどのように使用することができますか、私は混乱しています。これまで私はC#で以下のコードを持っています。 InvokerClassから

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 }); 


    } 

} 

私はクラス名を初期化するためにobjInstanceを使用したいと思いますが、私は方法がわかりません。そして今のところ、私はそれが正しい方法でやっているのかどうかわかりません。

+1

タイプt = Type.GetType( "???");をタイプt = objInstance.GetType()に置き換えます。 'objInstance'がヌルであることに気をつけてください –

+0

代わりにコンストラクタを自分で探しているならば、' Activator.CreateInstance(myType) 'を使って型のインスタンスを作ることができます。 – HimBromBeere

+0

'if(objInstance!= null){//ここで呼び出しを実行}'を使用することは信頼できると思いますか? @lopi確かに、 – lopi

答えて

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を使用し、コンストラクタを取得する必要がありwon't。 objInstance.GetType()を呼び出すときに、NullReferenceÈxceptionを回避するために、渡されたオブジェクトがnullでないことを確認するためにも注意してください。

+0

答えをありがとう、それを行うより良い方法は、私は適切な意味ですか? – lopi

+0

OK、ありがとう@HimBromBeere! :-) – lopi

+0

呼び出すメソッドの名前とパラメータ(上の例のように)を知っているとすれば、ここで動的な型指定を使用しない理由がありますか? – Gusdor

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 }); 
    } 


} 
+0

@ケビン、ありがとうございます。お願いします? Genericに変更するのは何ですか? – lopi

+0

コンパイル時に呼び出すタイプがわかっているものとします。 @lopiあなたは 'objInstance'が* compile-time *で何を知っていますか? – HimBromBeere

+0

不明ですか?私は本当に意味しない。 。 。 。 。 – lopi

関連する問題