2017-01-05 30 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

你试图调用静态方法,所以你不能指定对象的实例(摆脱“对象引用不设置到对象的实例”错误) 。而且,由于这种方法没有任何参数,你可以创建一个空的参数数组

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

它没有工作。 –

相关问题