2014-01-13 41 views
4

我有一个数据库表,其中包含两个文本字段:methodname和methodparameters。表中的值存储在字典中。具有多种参数类型的反射

每个methodname值对应于c#类中的图像过滤器方法,并且每个methodparameters是逗号分隔的数值列表。

我想使用反射来调用methodname及其相应的methodparameters列表。

这里是图像过滤器类的部分:

namespace ImageFilters 
{ 
    public class Filters 
    { 

    private static Bitmap mBMP; 

    public Bitmap BMP { 
     get 
     { 
      return mBMP; 
     } 
     set 
     { 
      mBMP = value; 
     } 
    } 

    public static void FilterColors(string[] paramlist) 
    { 

     mBMP = FilterColors(mBMP, 
          Convert.ToInt16(paramlist[0].ToString()), 
          Convert.ToInt16(paramlist[1].ToString()), 
          Convert.ToInt16(paramlist[2].ToString()), 
          Convert.ToInt16(paramlist[3].ToString()), 
          Convert.ToInt16(paramlist[4].ToString()), 
          Convert.ToInt16(paramlist[5].ToString()) 
          ); 

    } 

    public static Bitmap FilterColors(Bitmap bmp, int RedFrom,int RedTo, 
         int GreenFrom, int GreenTo, int BlueFrom, int BlueTo, 
         byte RedFill = 255, byte GreenFill = 255, 
         byte BlueFill = 255, bool FillOutside = true) 
    { 
     AForge.Imaging.Filters.ColorFiltering f = new AForge.Imaging.Filters.ColorFiltering(); 
     f.FillOutsideRange = FillOutside; 
     f.FillColor = new AForge.Imaging.RGB(RedFill, GreenFill, BlueFill); 
     f.Red = new AForge.IntRange(RedFrom, RedTo); 
     f.Green = new AForge.IntRange(GreenFrom, GreenTo); 
     f.Blue = new AForge.IntRange(BlueFrom, BlueTo); 
     return f.Apply(bmp); 
    } 

这里是我使用的代码,使用反射:

private static void ApplyFilters(ref Bitmap bmp, 
         dictionaries.FilterFields pFilters) 
    { 

     for(int i = 0; i < pFilters.Detail.Length; i++) 
     { 
      Type t = typeof(ImageFilters.Filters); 
      MethodInfo mi = t.GetMethod(pFilters.Detail[i].MethodName); 
      ImageFilters.Filters f = new ImageFilters.Filters(); 
      f.BMP = bmp; 

      string[] parameters = pFilters.Detail[i].MethodParameters.Split(','); 
      mi.Invoke(f, parameters); 
     } 
    } 

每个图像与没有过滤器进行处理,并与两组不同的过滤器(来自数据库)。下面的循环处理过滤器:

 foreach (KeyValuePair<string, dictionaries.FilterFields> item 
       in dictionaries.Filters) 
     { 
      bmp = OriginalBMP; 

      ApplyFilters(ref bmp, item.Value); 

     } 

我的问题是,当它击中的环ApplyFilters,它给了我下面的错误:

“未找到方法:“太虚ImageFilters.Filters.set_BMP( System.Drawing.Bitmap)”,它甚至没有让我步入ApplyFilters方法。

我绝对不有所谓的‘set_BMP’的方法在我的数据库表。

任何想法?

+2

set_BMP是一个属性的设置器,而不是方法 – thumbmunkeys

+0

@Richard,你将不得不告诉我们什么'pFilters.Detail [i] .MethodName'具有100%的确定性。 (打印到控制台或其他东西,并复制并粘贴值) –

+0

* >>它甚至不允许我进入ApplyFilters方法*您可以在那里放置一个断点?但是,是的,我不认为你可以将属性设置器作为方法来处理,你需要将它们作为属性访问。 –

回答

1

您收到的错误是JIT错误。在运行时,您正试图呼叫ApplyFilters。运行时然后尝试编译从MSIL到机器码的ApplyFilters方法。在那个时候,它看到你正在Filters类上使用名为BMP的属性,但它找不到它(或找不到设置者)。因此它不能编译该方法,也不能调用它,这就是为什么你的断点没有被击中。

看来BMP属性(或其setter)在运行时不存在。这通常是因为在运行时加载了不同版本的程序集 - 您使用具有此属性的一个版本进行编译,但在运行时,引用的程序集不包含该属性。

仔细检查目录中存在的程序集是否是最新的并且是您期望的正确版本。

+0

我做了一个干净的和重建,但仍然是相同的错误。 – Richard

+0

来自原始帖子的所有代码片段是否位于同一个程序集中? –

+0

你有多个名为'ImageFilters'的工件吗?在上面的代码中,'ImageFilters'是一个名字空间。你是否还有任何名为'ImageFilters'的类或属性? –

0

您的BMP不是一种方法,它是一个属性。获得该物业,然后获得物业的.SetMethod

PropertyInfo pi = type.GetProperty("BMP"); 
System.Reflection.MethodInfo mi = pi.SetMethod; 

string[] parameters = pFilters.Detail[i].MethodParameters.Split(','); 
mi.Invoke(f, parameters); 
+0

我没有时间试图将BMP作为一种方法调用,我没有定义Set_BMP – Richard

+0

这不是问题,'ApplyFilters'方法是包含反射的代码,运行时无法编译'ApplyFilters'方法。 –

+0

您的Invoke是不是调用它?你调用的是什么然后? –