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

C# 如何在不传递类型参数的情况下调用扩展方法?,c#,generics,extension-methods,type-inference,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 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; }
    }
在这种情况下,由于方法上的约束条件
TGame:Game
,我希望扩展方法将
TGame
推断为
Cricket
TRules
推断为
CricketRules

在调用扩展方法时,有没有办法避免显式传递类型参数


注意:我看到一些SO答案建议(对于稍微不同的场景)将扩展方法分成两个(在不同的类中),每个类都使用一个类型参数,但无法找出在这种情况下适用的类似方法。

您可以在lambda中指定类型:

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

通常(或者更确切地说,几乎总是)您会忽略类型名。人们经常忽略它,以至于忘记了可以将类型名称放在那里…:)

谢谢,但我希望避免完全传入类型参数,并对其进行推断。
TRule
类型名应该很长,这就是为什么我试图提供一个扩展方法,而不是每次设置
cricket.rules=new LongRulesName{…}
。@Khan我以为你不喜欢传递
TGame
。。。但是怎样才能推断出真相呢?一、 作为一个人,我甚至无法推断@汗啊,我明白了!因此,您需要将两种类型“关联起来:
Cricket
CricketRules
。是这样吗?我原以为它会从扩展方法的
TGame:Game
约束中推断出来。因此,当我对类型为
Cricket
的对象调用该方法时,我希望它也将
TRules
推断为
CricketRules
。它可能不受C#的支持,但可能还有其他的解决方法,比如分成两个扩展方法,每个扩展方法只接受一个类型参数?刚刚看到你的最新评论,是的,这就是我想要的
    new Cricket().SetRules<Cricket, CricketRules>(r => { r.SomeRule = "rule"; });
    new Cricket().SetRules(r => { r.SomeRule = "rule"; }); // doesn't compile
new Cricket().SetRules((CricketRules r) => { r.SomeRule = "rule"; });