2016-03-22 4 views
1

Можно ли указать ограничение на общий параметр C#, где этот параметр должен быть абстрактным? Итак, в настоящее время у меня есть метод, в котором общий параметр должен иметь конструктор без параметров, но теперь я пришел к сценарию, где мне нужен абстрактный T, поэтому я надеялся перегрузить метод тем, который принимает только абстракцию. TsОграничение общего параметра как абстрактного

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 

Если, как я подозреваю, ответ «вы не можете этого сделать», есть ли разумные обходные пути?

+4

Там нет ограничений для абстрактно - и его не ясно, что вы хотите сделать, что вы думаете, что нужно абстрактное ограничение. Вы можете ограничить класс, который является абстрактным (например, 'SomeBase' в вашем коде). – Jamiec

+2

Новое ограничение просто существует, чтобы определить, есть ли у вас значение или ссылочный тип. Однако я не вижу никакого практического использования для абстрактного ограничения. Какая польза от 'IEnumerable ' вы надеетесь, что 'IEnumerable ' won't также есть? – HimBromBeere

+1

Как насчет наследования * SomeBase * в новый абстрактный класс, а затем с использованием *, где T: NewAbstractClass *? – bit

ответ

3

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

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     throw new Exception(string.Format("Cannot use SomeMethod with type {0} because it is abstract.", type.FullName)); 
    } 

    // Do the actual work 
} 

Или:

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     SomeMethodAbstract<T>(SomeParam); 
    } 
    else 
    { 
     SomeMethodNonAbstract<T>(SomeParam); 
    } 
} 
+0

Это может сработать – DJL

Смежные вопросы