Как я могу это сделать без необходимости иметь два родовых типа в MyClass. В конце концов, если мы знаем, что первым является SomeProxy, ему следует следовать, что вторым является SomeClass.
blockquote>Хотя вы, кажется, нашли ответ на основную часть вопроса, я решил, что я Я предлагаю свое понимание этой части. Похоже, вы хотите, чтобы вы могли сделать что-то вроде этого:
class Proxy<T> { T Value { get; set; } } class MyClass<U> where U : Proxy<> { }
и чтобы компилятор заполнил параметр типа
Proxy
, когда вы предоставляетеU
. Поскольку вы объявили U как наследуемый от Proxy, вы должны использовать один из методов в Proxy, который, вероятно, использует параметр T, например:class MyClass<U> where U : Proxy<> { void SomeMethod(U parameter) { var local = parameter.Value; //more code here... } }
Теперь, что такое компилятор, который должен вывести здесь
local
? Это основная проблема, которую я вижу, что делает такую функцию, если возможно, трудно реализовать. Если вы не хотите использовать какие-либо методы, использующие общий тип прокси-сервера, вместо этого вы можете сделать не общий базовый класс и использовать его дляU
и обойти всю проблему.Я а не писатель-компилятор, но на ум приходит пара возможностей того, как это можно решить. Он мог бы просто сказать объект (или любое другое ограничение, которое вы указали в параметре type в Proxy), но это не кажется совершенно правильным или совершенно нормальным дженериком. Это также потребовало бы, чтобы CLR разрешала открывать общие типы как ограничение на общий параметр, что я сомневаюсь в этом. Другой вариант, который я мог видеть, - это тип, который фактически имеет параметр второго типа, и компилятор, чтобы дать вам синтаксический сахар, чтобы облегчить его.
Как бы вы ни пошли, эта функция кажется много работа для небольшого преимущества в том, что, вероятно, является редким сценарием, поэтому вряд ли можно сделать разрез.