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

问题描述 投票:0回答:1

我具有以下类型:

    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>

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

Note:我已经看到一些SO答案,建议(针对略有不同的情况)将扩展方法分为两个(在不同的类中),每个方法都使用一个类型参数,但是无法找出相似的方法在这种情况下会起作用。

c# generics extension-methods type-inference
1个回答
0
投票

您可以在lambda中指定类型:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.