2009-03-29 4 views

ответ

1

Это невозможно. Если вы думаете об этом, параметр типа задается во время компиляции, тогда как System.Type разрешается путем отражения во время выполнения.

Теперь, сказав, что это невозможно, можно использовать отражение. Если вы создадите класс с отражением, вы можете передать его в System.Type в качестве параметра, но, вероятно, стоит переоценить то, что вы пытаетесь сделать.

EDIT: Вот некоторые идеи для редизайна.

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

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

0

Вы можете сделать это, используя отражение.

Вы не хотите менять свой дизайн вместо этого (чтобы избежать рефлексации)? Таким образом, вы можете передать свой тип в качестве параметра:

DoSomething(yourObject.GetTaype()); 
0

Рассмотрите возможность использования альтернативного дизайна. Общие типы предназначены для статического разрешения во время компиляции.

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

public class TypeReporter<T> { 
    public TypeReporter() { 
     Console.WriteLine("this type is: {0}", typeof(T)); 
    } 

    // other methods 
} 

public class StackOverflow694683 { 
    static void Main() { 
     string n = "..."; // Pick a type, such as System.String. 
     Type arg = Type.GetType(n); 
     Type genericClass = typeof(TypeReporter<>); 
     Type createdClass = genericClass.MakeGenericType(arg); 

     // Result is of TypeReporter<T> type. Invoke desired methods. 
     object result = Activator.CreateInstance(createdClass); 
    } 
} 
1

То, о чем вы просите, не возможно в .Net. Параметры типа - это операция типа компиляции в .Net (C# и VB). Экземпляр System.Type - это среда выполнения. Любые запросы о реальном типе за System.Type должны выполняться во время выполнения. Таким образом, решения несовместимы.

Для примера:

public void DoSomething<T>(T value) { 
    // Do something with a value of type T 
} 

public Example1() { 

    DoSomething(42); // Calls DoSomething<int> 
    Type t1 = typeof(int); 
    DoSomething(t1); // Calls DoSomething<Type> 

    object o1 = 42; 
    Type t2 = o1.GetType(); 
    DoSomething(???) // No way to call DoSomething<int> here without some 
        // wild reflection because the call to DoSomething is 
        // established at compile type where t2 is established 
        // at runtime 
} 
0

Что вы обычно делаете, чтобы иметь перегруженные для универсального метода, специально для этих видов деятельности. Например:

Load<T>(); 
Load(Type type); 
+0

Вот что -I- обычно, но метод является сторонним, и он принимает только SomeMethod (); структура ... вот почему я просил .. –

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