Тип параметра, установленный из аргумента типа - PullRequest
3 голосов
/ 31 января 2011

Как мне преобразовать мой аргумент в правильное объявление типа. То есть. как перейти от type к T в следующем

class Foo<T>
{  
  Foo<??> MakeFoo(Type type)
  {
    return new Foo<??>();
  }

  Void Get(T aFoo)
  {
    ...
  }
}

Ответы [ 2 ]

5 голосов
/ 31 января 2011

Вы не можете.

Общие параметры используются и применяются компилятором, в то время как Type является частью отражений, предназначенных для работы с информацией о типах во время выполнения.Таким образом, вы просто не можете определить, какой тип компилятора следует использовать, если у вас есть только System.Type.

Однако вы можете сделать наоборот:

public void Foo<T>()
{
  Type t = typeof(T);
}

Так что если вам действительно не нужно использовать Type в качестве параметра вы можете сделать следующее:

Foo<FooParam> MakeFoo<FooParam>()
{
  return new Foo<FooParam>();
}
2 голосов
/ 31 января 2011

Вы не можете сделать это, потому что «Тип» - это набор отраженных метаданных классов, структур и / или перечислений.

«Т» - это тип.

Выможет дать тип в качестве аргумента, используя отражение:

type.MakeGenericType(type).GetConstructor(Type.EmptyTypes).Invoke(null)

Но я проголосую за добавление общего параметра "S" вместо входного параметра "Тип типа", чтобы избежать использования отражения, котороебесполезно в этом случае, если вы все сделаете правильно!

...