Я в первую очередь программист на Java, так что это будет один из вопросов «что это такое из Java, эквивалентного C#». Таким образом, в Java, вы можете ограничить доступ типа класса аргумент во время компиляции продлить определенный супер-класса, например, так:Убедитесь, что экземпляр экземпляра представляет тип, назначаемый из определенного класса
public <T extends BaseClass> void foo(Class<T> type) {
...
}
и даже
public <T extends BaseClass> T foo(Class<T> type) {
...
}
Вы даже можете приковать несколько интерфейсов :
public <T extends BaseClass & BaseInterface1 & BaseInterface2> void foo(Class<T> type) {
...
}
Как это делается на C#? Я знаю, что вы можете использовать «где T: BaseClass», но это применимо только тогда, когда у вас есть экземпляр T. Как насчет того, когда у вас есть экземпляр типа?
EDIT:
Для объяснения, вот что я хотел бы сделать:
СБОРКА # 1 (base.dll):
abstract class BaseClass {
abstract void Foo();
}
СБОРКА # 2 (sub1.dll, ссылки base.dll):
class SubClass1 : BaseClass {
void Foo() {
// some code
}
}
СБОРКА # 3 (sub2.dll ссылки base.dll):
class SubClass2 : BaseClass {
void Foo() {
// some other code
}
}
СБОРКА # 4 (main.dll ссылки base.dll):
class BaseClassUtil {
static void CallFoo(Type<T> type) where T : BaseClass {
T instance = (T)Activator.CreateInstance(type);
instance.Foo();
}
}
public static void Main(String[] args) {
// Here I use 'args' to get a class type,
// possibly loading it dynamically from a DLL
Type<? : BaseClass> type = LoadFromDll(args); // Loaded from DLL
BaseClassUtil.CallFoo(type);
}
Таким образом, в этом примере, я не волнует, что класс представляет собой переменную 'тип', до тех пор, он получен из BaseClass, поэтому, как только я создаю экземпляр, вы можете вызвать Foo().
Элементы, которые не являются кодом Vaild (а скорее некоторым Java-макетом), являются «универсальными» типами классов: Тип < T> и тип <? : BaseClass>.
Спасибо за ваш ответ, но я не уверен, что это соответствует моим потребностям. Проблематичной частью является часть класса «» - я не думаю, что это действительный синтаксис C#, и это проблема. Если бы это было так, то это, безусловно, решило бы мою проблему. Но я уверен, что это не так. –
milin
@milin Я написал вам небольшой пример. Надеюсь, что это очистит ваши сомнения. – mybirthname
Я добавил пример того, что я хотел бы сделать. Я чувствую, что мои объяснения недостаточно ясны, потому что ваш пример об общих экземплярах, и у меня есть проблема с типичными экземплярами типа. – milin