2017-01-05 8 views
0

私はそれが次のコードを使用して、動的にクラスを派生していますから、別のアセンブリから基底クラスの静的メソッドを呼び出すためにしようとしている:動的に実行別のアセンブリ上の派生クラスから基底クラスのメソッド

Assembly executingAssembly = Assembly.GetExecutingAssembly(); 

Assembly objectAssembly = 
    Assembly.Load(executingAssembly.GetReferencedAssemblies(). 
    Where(a => a.Name == "WebDelightBLL").FirstOrDefault()); 

Type myType = objectAssembly.GetType("WebDelightBLL.Ingredient"); 

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 

object myInstance = Activator.CreateInstance(myType); 

dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 

コードでDLL次

public class BaseClass<DerivedClass> 
{ 
    public static Type MyType() 
    { 
     return typeof(DerivedClass); 
    } 
    public static string Prefix() 
    { 
     return "Sp" + MyType().Name; 
    } 
    public static DataTable GetAll() 
    { 
     try 
     { 
      DataTable dt = GetSP(Connection.connectionString(), 
       Prefix() + "GetAll", 5); 
      return dt; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 
public class Ingredient : BaseClass<Ingredient> 
{ 
    public string SayHello() 
    { 
     return "Hello, World!"; //Just to exemplify a point 
    } 
} 

しかし、私はいつも、私はノーを取得例えば

は私が呼び出そう「のsayHelloを()」「オブジェクト参照がオブジェクトのインスタンスに設定されていません」を取得エラー。

これも可能ですか?

更新:それは魅力のように働いたクリープによって示されるようにBindingFlags.FlattenHierarchyを追加することにより

。作業コードは次のようになります。

+0

を作成することができます任意のパラメータを持っていないので、あなたは、あなたの質問への答えを作成したい、とあなたのソリューションとしてこれを選択すること:) –

+0

はそれは公平ではないでしょう@Creepが答えを出して解決策として選んだとしたら?これは私の最初のポストです。私はクリープにできるだけ丁寧になりたい、将来の頭痛の多くを保存したいと思います... –

+0

私の悪い - 私はクリープの答えが本質的にソリューションであることを認識していません(あなたの実際のコードベース)。ですから、私は解決策として彼の答えを選ぶことを提案します。 –

答えて

1

あなたのメソッドは基本クラスで静的なので、その子に属しません。
次のコードは動作します:

Type myType = objectAssembly.GetType("WebDelightBLL.BaseClass"); 
MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
myMethod.Invoke(null, null); 
+0

ここで問題となるのは、コードのダイナミクスを維持するために、派生クラスから呼び出さなければならないということです。 –

+1

ちょっと推測しますが、子クラスを操作してフラグを追加すると、 BindingFlags.FlattenHierarchy 'タイプmyType = objectAssembly.GetType(" WebDelightBLL.Ingredient "); MethodInfo myMethod = myType.GetMethod( "GetAll"、BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); myMethod.Invoke(null、null); ' – Creep

+1

素晴らしい! ;)FlatterHierarchyはそれをしました... –

1

あなたが(を取り除くために、エラー「オブジェクト参照オブジェクトのインスタンスに設定されていません」)を使用すると、オブジェクトのインスタンスを指定することはできませんので、静的メソッドを呼び出すようにしようとしています。この方法は、あなただけの空のパラメータ配列

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
// dont need this 
//object myInstance = Activator.CreateInstance(myType); 

//dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 
dgvResultsRES.DataSource = myMethod.Invoke(null, new object[0]); 
+0

それは動作しませんでした。 –

関連する問題