对重载方法的 C# 函数引用

本文关键字:函数 引用 重载 方法 | 更新日期: 2023-09-27 17:55:35

>我有一个静态类,其中包含一些重载方法。我想知道是否有一种简单/优雅的方法可以将对正确重载方法的引用传递给我的另一种方法。

ObjectComparer.cs:

internal static class ObjectComparer {
    internal static void AssertAreEqual(Company expected, Company actual) {
        // ...
    }
    internal static void AssertAreEqual(Contact expected, Contact actual) {
        // ...
    }
}

收藏比较器.cs:

internal static class CollectionComparer {
    internal static void AssertAreEqual<T>(List<T> expected, List<T> actual, Action<T, T> comparer) 
    {
        Assert.AreEqual(expected.Count, actual.Count);
        for (var i = 0; i < expected.Count; i++) 
        {
            comparer(expected[i], actual[i]);
        }
    }
}

公司存储库单元测试.cs:

[TestMethod]
public void GetAllCompaniesTest()
{
    // some work that creates 2 collections: expectedCompanies and actualCompanies
    // I am hoping I can write the following method 
    // but I am getting an error over here saying 
    // The best overloaded method ... has invalid arguments
    CollectionComparer.AssertAreEqual(expectedCompanies, actualCompanies, ObjectComparer.AssertAreEqual);
}

编辑

事实证明,编译器在抱怨我的另一个论点:实际公司。这是一个 ICollection 而不是列表。

道歉。这是一个非常愚蠢的错误。

对重载方法的 C# 函数引用

我认为这也会有所帮助,如果你的比较器是静态的并且永远不会改变,你可能不需要每次都传递它。

internal static class CollectionComparer {
internal static void AssertAreEqual<T>(List<T> expected, List<T> actual) 
    {
        Assert.AreEqual(expected.Count, actual.Count);
        for (var i = 0; i < expected.Count; i++) 
        {
            CollectionComparer.AssertAreEqual(expected[i], actual[i]);
        }
    }
}
您可能

希望在作为参数传递时按如下方式实例化Action AssertAreEqual

var action=  new Action<Company,Company>(ObjectComparer.AssertAreEqual);
CollectionComparer.AssertAreEqual(expectedCompanies, actualCompanies, action); 

对于Contact,您可以简单地执行以下操作:

var action=  new Action<Contact,Contact>(ObjectComparer.AssertAreEqual);