Pep*_*por 4 c# generics constraints
我目前正在重写自定义RPC机制的一部分(不能被其他东西替换,所以不建议;-)).调用的参数收集在内部使用字典的自定义集合中.有一种方法T Get<T>(string)可以检索命名参数.对于可选参数,我想添加一个TryGet<T>(string)返回参数的方法,或者null如果它不存在,那么调用代码可以使用null合并运算符提供默认值.当然,对于值类型,这不起作用,但我可以使用T?,这是我想要的.
所以我拥有的是:
public class Arguments
{
// lots of other code here
public T TryGet<T>(string argumentName) where T : class
{
// look up and return value or null if not found
}
public T? TryGet<T>(string argumentName) where T : struct
{
// look up and return value or null if not found
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我希望能够做到以下几点:
return new SomeObject(
args.TryGet<string>("Name") ?? "NoName",
args.TryGet<int>("Index") ?? 1
);
Run Code Online (Sandbox Code Playgroud)
由于约束是互斥的,编译器应该能够生成正确的代码(始终可以从调用站点给出的泛型类型推断出调用).编译器抱怨该类型已经定义了一个名为"TryGet"的成员,该成员具有相同的参数类型.
有没有办法让这样的工作没有给这两种方法不同的名字?
.NET Framework中的类处理此方案的方式是TryGetValue使用out参数.返回值是get是否成功的指示符,其中out参数包含请求的值(成功时)或合适的默认值(失败时).
这种模式使得实现对于引用和值类型非常简单.您只需要一种方法来处理这两种情况.
有关此模式的示例,请参阅Dictionary<TKey,TValue>.TryGetValue.