查找对象是否具有特定方法
本文关键字:方法 对象 是否 查找 | 更新日期: 2023-09-27 18:26:43
我正在努力编写一个不仅易读而且灵活的代码。为此,我更频繁地使用接口。例如,我不使用List作为方法的参数,而是尽可能使用IEnumerable。
但是检查这个方法
public static Color MeanColor(this IEnumerable<Color> list) {
var colors = list as Color[] ?? list.ToArray();
if (!colors.Any()) {
// Gray is the mean of all colors (Black+White/2)
return Color.FromArgb(127, 127, 127);
}
var r = 0;
var g = 0;
var b = 0;
foreach (var c in colors) {
r += c.R;
g += c.G;
b += c.B;
}
return Color.FromArgb(r / colors.Length, g / colors.Length, b / colors.Length);
}
由于我需要使用Length方法/属性,所以我不能只使用IEnumerable。因此,我会检查它是否是一个数组,如果不是,我会使用ToArray()方法将其转换为一个数组。
我试着在foreach循环中使用一个"count"变量,比如这个
int count = 0;
foreach (var c in colors) {
r += c.R;
g += c.G;
b += c.B;
count++;
}
但性能上的影响要大于将50000元素的List转换为和数组。
所以我想知道:是否有可能"询问对象"是否有方法"X"?在这种情况下,是否有Count属性或GetLength()方法"询问"对象。
编辑:在这种情况下,蒂姆的回答确实解决了我的问题。但问题仍然存在,有可能问一个对象有一个特定的方法/属性吗?
您可以使用Enumerable.Count
:
public static Color MeanColor(this IEnumerable<Color> list) {
int count = list.Count();
// ...
return Color.FromArgb(r / count, g / count, b / count);
}
请注意,如果查询不是集合,这将完全执行查询,因此我只使用了该变量一次。
可以通过使用.net反射来请求对象属性的存在,这是代码分析对象和类的能力。在您的情况下,通过对类型使用GetMethod
方法,您可以通过检查null来查看哪些方法存在或不存在。
MethodInfo mInfo = typeof(Program).GetMethod("MethodA");
var methodExists = mInfo != null;
构造函数、字段、属性等(GetConstructor
、GetField
、GetProperties
…)也存在相同的原理
找到一些方法(如反射方法)更为复杂,但您可以在这个网站上找到一些指针