我有一个数据库表,其中包含两个文本字段: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’的方法在我的数据库表。
任何想法?
set_BMP是一个属性的设置器,而不是方法 – thumbmunkeys
@Richard,你将不得不告诉我们什么'pFilters.Detail [i] .MethodName'具有100%的确定性。 (打印到控制台或其他东西,并复制并粘贴值) –
* >>它甚至不允许我进入ApplyFilters方法*您可以在那里放置一个断点?但是,是的,我不认为你可以将属性设置器作为方法来处理,你需要将它们作为属性访问。 –