Тип как общий "T", используя отражение - PullRequest
3 голосов
/ 10 августа 2010

Могу ли я сделать следующее?

public static T Merge<T>()
{
     object x = Activator.CreateInstance<T>();
     //Do some stuff with x 
     return (T)x;
}

private static Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return assembly.GetTypes().Where(
        t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal) & 
             !t.IsInterface).ToArray();
}

public static void Main()
{
    Type[] typelist = GetTypesInNamespace(
        Assembly.GetExecutingAssembly(), "Myapplication.Web.DomainObjects");

    Parallel.ForEach(typelist, type =>
    {
        var  task1 = Task.Factory.StartNew(() => Merge<type>());
        // is it possible to do this way? Merge<type> ??    
    });
}

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

Нет, вы не можете этого сделать - универсальные значения используются, когда вы заранее знаете тип во время компиляции, однако в этом случае вы этого не делаете.

Я считаю, что то, что вы действительно хотите сделать, это что-то вроде этого:

public static object Merge(Type type)
{
    object x = Activator.CreateInstance(type);
    //Do some stuff with x 
    return x;
}

Ваш оператор foreach теперь выглядит немного иначе:

Parallel.ForEach(typelist, type =>
{
    var task1 = Task.Factory.StartNew(() => Merge(type));
});
0 голосов
/ 10 августа 2010

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

  Parallel.ForEach(typelist, type => {
    var methodInfo = typeof(YourClass).GetMethod("Merge").MakeGenericMethod(type);
    var  task1 = Task.Factory.StartNew(() => methodInfo.Invoke(null, new object[0]));
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...