2017-01-05 7 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을 추가함으로써

. 작업 코드는 다음과 같습니다.

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

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

     //object myInstance = Activator.CreateInstance(myType); <-- not needed. 

     dgvResultsRES.DataSource = myMethod.Invoke(null, null); 
+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

을 당신이 개체의 인스턴스를 지정 할 수 있도록 정적 메소드 (method)를 불러들이려고하고 ("개체의 인스턴스로 설정되지 않았습니다 개체 참조"를 제거하는 오류) . 이 방법은 매개 변수를 가지고 있지 않기 때문에 그리고 당신은 단지 빈 매개 변수 배열을 만들 수 있습니다

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

그것은 작동하지 않았다. –