如何在不传递类型参数的情况下调用扩展方法?

时间:2020-05-10 11:59:40

标签: c# generics extension-methods type-inference

我有以下几种类型:

    public abstract class Game<TRules>
        where TRules : new()
    {
        public TRules Rules { get; set; } = new TRules();
    }

    public class Cricket : Game<CricketRules>
    {
    }

    public class CricketRules
    {
        public string SomeRule { get; set; }
    }

我还有一个扩展方法,可以帮助设置rules属性:

    public static class GameExtensions
    {
        public static void SetRules<TGame, TRules>(this TGame game, Action<TRules> setter)
            where TGame : Game<TRules>
            where TRules : new()
        {
            setter(game.Rules);
        }
    }

我可以调用扩展方法:

    new Cricket().SetRules<Cricket, CricketRules>(r => { r.SomeRule = "rule"; });

但是当我省略指定类型参数时出现错误:

    new Cricket().SetRules(r => { r.SomeRule = "rule"; }); // doesn't compile

在这种情况下,由于约束TGame,我期望扩展方法既可以将Cricket推断为TRules,也可以将CricketRules推断为TGame : Game<TRules>。方法。

有什么方法可以避免在调用扩展方法时显式传递类型参数?

注意:我已经看到一些SO答案,建议(针对略有不同的情况)将扩展方法分为两个(在不同的类中),每个方法都使用一个类型参数,但无法计算提出了一种适用于这种情况的类似方法。

1 个答案:

答案 0 :(得分:1)

您可以在lambda中指定类型:

new Cricket().SetRules((CricketRules r) => { r.SomeRule = "rule"; });

通常(或几乎总是),您将忽略类型名称。人们经常忽略它,以至于人们忘记了您可以在其中键入类型名称...:)