Можно ли упростить этот общий код C # и передать только один тип? - PullRequest
4 голосов
/ 20 декабря 2011

Следующий код от моего товарища по команде работает:

 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.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Поскольку единственное место, где появляется V, находится в подписи, я бы подумал, что вы можете изменить его на:

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

Но у меня нет примера кода, чтобы проверить это.

3 голосов
/ 20 декабря 2011
public T Get<T>(IAzureTable<T> repo, string pk, string rk)
        where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
2 голосов
/ 20 декабря 2011

Да

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.

...