【问题标题】:Can this C# generic code be simplified and just one type be passed in?可以简化此 C# 通用代码并仅传入一种类型吗?
【发布时间】:2011-12-20 10:10:26
【问题描述】:

我队友的以下代码有效:

 public T Get<T, V>(V repo, string pk, string rk)
            where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
            where V : IAzureTable<T>
        {
            try
            {
                var item = repo.GetPkRk(pk, rk);
                if (item == null) throw new Exception(); return (T)item;
            }
            catch (Exception ex)
            {
                _ex.Errors.Add("", typeof(T).Name + rk + " does not exist");
                throw _ex;
            }

        }

调用代码:

var account = base.Get<Account, IAzureTable<Account>>(_accountRepository, pk, rk);

可以简化吗。这里唯一的类型变量是“Account”,我想知道 T 和 V 类型是否可以合并为一个,因为 V 仅取决于 T。

【问题讨论】:

    标签: c# c#-4.0 c#-3.0


    【解决方案1】:

    由于V 出现的唯一位置是在签名中,我原以为您可以将其更改为:

    public T Get<T>(IAzureTable<T> repo, string pk, string rk)
            where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
    

    但是我没有方便的示例代码来测试它。

    【讨论】:

      【解决方案2】:
      public T Get<T>(IAzureTable<T> repo, string pk, string rk)
              where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
      

      【讨论】:

        【解决方案3】:

        是的

        public T Get<T>(IAzureTable<T> repo, string pk, string rk)
        {
            ...
        }
        

        然后

        var account = base.Get<Account>(_accountRepository, pk, rk);
        

        你甚至可以侥幸逃脱

        var account = base.Get(_accountRepository, pk, rk);
        

        如果编译器可以从_accountRepository推断出参数类型。

        【讨论】:

        • 谢谢安德鲁。我将此标记为已接受,因为您的最后一条评论使我不必输入
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多