代码之家  ›  专栏  ›  技术社区  ›  friedo

具有相同名称和参数但结果和约束不同的多个泛型方法

  •  3
  • friedo  · 技术社区  · 14 年前

    我目前正在重写自定义RPC机制的部分内容(不能用其他内容替换,因此不要建议;-)。调用的参数收集在内部使用字典的自定义集合中。有一种方法 T Get<T>(string) 以检索命名参数。对于可选参数,我想添加 TryGet<T>(string) 返回参数或 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
        }
    }
    

    有了这一点,我希望能够做到以下几点:

    return new SomeObject(
                          args.TryGet<string>("Name") ?? "NoName",
                          args.TryGet<int>("Index") ?? 1
                          );
    

    由于约束是互斥的,编译器应该能够生成正确的代码(总是可以从调用站点上给定的泛型类型推断调用)。编译器抱怨类型已经用相同的参数类型定义了一个名为“tryget”的成员。

    有没有什么方法可以使类似这样的工作,而不给这两种方法取不同的名称?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Darin Dimitrov    14 年前

    public T TryGet<T>(string argumentName)
    {
        if (!_internalDictionary.ContainsKey(argumentName))
        {
            return default(T);
        }
        return (T)_internalDictionary[argumentName];
    }
    
        2
  •  5
  •   Paul Turner    14 年前
        4
  •  3
  •   Paolo Tedesco    14 年前

    public class Arguments {
        public T Get<T>(string argumentName,T defaultValue) {
            // look up and return value or defaultValue if not found
        }
    }
    
    return new SomeObject(
        args.Get<string>("Name","NoName"),
        args.Get<int>("Index",1)
    );
    

    return new SomeObject(
        args.Get("Name","NoName"),
        args.Get("Index",1)
    );