查找对象是否具有特定方法

本文关键字:方法 对象 是否 查找 | 更新日期: 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;

构造函数、字段、属性等(GetConstructorGetFieldGetProperties…)也存在相同的原理

找到一些方法(如反射方法)更为复杂,但您可以在这个网站上找到一些指针