我有以下几种类型:
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答案,建议(针对略有不同的情况)将扩展方法分为两个(在不同的类中),每个方法都使用一个类型参数,但无法计算提出了一种适用于这种情况的类似方法。
答案 0 :(得分:1)
您可以在lambda中指定类型:
new Cricket().SetRules((CricketRules r) => { r.SomeRule = "rule"; });
通常(或几乎总是),您将忽略类型名称。人们经常忽略它,以至于人们忘记了您可以在其中键入类型名称...:)