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"; });