как передать несколько общих аргументов - PullRequest
5 голосов
/ 29 июля 2011

Мне было интересно, есть ли способ создать класс, который может принимать несколько универсальных аргументов, которые не известны во время компиляции

   class Something<T,V,U> 

В этом примере показан класс, который ожидает получить 3 универсальных аргументаво время выполнения.я ищу способ указать класс, который бы кроме нескольких аргументов различного количества

что-то по линии

    class Something<T[]> 

, который я мог бы позже выставить, используя отражение

  Type [] types = GetType().GetGenericArguments(); 

Ответы [ 2 ]

7 голосов
/ 29 июля 2011

Вы не можете указать неизвестное количество генериков. Самое близкое, что вы можете получить, - это определить все возможные варианты или, по крайней мере, столько, сколько вы готовы обработать.

public class Something { }
public class Something<T1> : Something { }
public class Something<T1, T2> : Something { }
public class Something<T1, T2, T3> : Something { }
public class Something<T1, T2, T3, T4> : Something { }
public class Something<T1, T2, T3, T4, T5> : Something { }
...

Базовый класс (в данном примере class Something без обобщений) даст вам что-то общее для ссылок, а также место для централизации как можно большего количества кода.

В зависимости от ваших злых намерений, вы можете в конечном итоге написать много избыточного кода, и в этом случае вам следует пересмотреть использование дженериков.

2 голосов
/ 29 июля 2011

Вы можете создать некоторый класс - своего рода

public static class TypeHelper
{
    public static IEnumerable<Type> GetTypeCombination(this Type type)
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(T<,>))
            return type.GetGenericArguments().SelectMany(GetTypeCombination);

        return new Type[] { type };
    }
}

public class T<T1, T2>
{
    public static IEnumerable<Type> GetTypeCombination()
    {
        return typeof(T1).GetTypeCombination()
            .Concat(typeof(T2).GetTypeCombination());
    }
}

и использовать его в качестве

var list = T<int, T<string, int[]>>.GetTypeCombination().ToList();

для получения (передачи) динамического списка типов - не уверен, что это лучшийспособ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...