2015-04-02 117 views
0

我想創建一個泛型類型的實例,其中類型作爲泛型傳遞也具有泛型。類型與泛型類型作爲泛型傳遞也具有泛型引起ArgumentException

下面的代碼發生問題:

internal virtual RouteBase GetRoute(DbContextTypeProvider databaseContextTypeProvider, Type model) 
{ 
    Type catchallRoute = typeof(CatchallRoute<,>); 
    catchallRoute.MakeGenericType(new Type[] { 
     databaseContextTypeProvider.DbContextType, 
     model 
    }); 

    Type routeTypeWrapper = typeof(RouteTypeWrapper<>); 
    routeTypeWrapper.MakeGenericType(new Type[] { 
     catchallRoute 
    }); 

    RouteTypeProvider routeTypeProvider = (RouteTypeProvider)Activator.CreateInstance(routeTypeWrapper); 

    return GetRoute(databaseContextTypeProvider, model, routeTypeProvider); 
} 

我基於周圍什麼可以在以下SO問題可以看出的代碼,當我使用一種類型的需要以相同的方式泛型如圖中接受的答案實例可以被創建,但類型需要與泛型類型我似乎無法得到這個工作:

Pass An Instantiated System.Type as a Type Parameter for a Generic Class

我找不到任何MSDN例子,說明如何創建at的實例類型泛型的地方,它需要的一種泛型也需要泛型。

如果我的代碼它,這樣的類型關閉它看起來像下面這樣:

RouteTypeWrapper<CatchallRoute<SapphireDbContext<SiteTree>,SiteTree>> routeTypeProvider = new RouteTypeWrapper<CatchallRoute<SapphireDbContext<SiteTree>,SiteTree>>(); 

這實際上是我想要做的,但使用反射,這樣的參數可以傳遞給方法以便可以創建並返回實例。

但是,當我使用反射,我得到以下錯誤:

Cannot create an instance of Sapphire.Cms.Web.Routing.RouteTypeWrapper`1[TRoute] because Type.ContainsGenericParameters is true.

是什麼,我試圖做的可能,如果這樣我怎麼能改正使其作品的代碼?

回答

1

MakeGenericType返回一個新類型。它不會修改現有的類型。更改您的代碼,如下所示,以獲得MakeGenericType的結果

internal virtual RouteBase GetRoute(DbContextTypeProvider databaseContextTypeProvider, Type model) 
{ 
    Type catchallRoute = typeof(CatchallRoute<,>).MakeGenericType(new Type[] { 
     databaseContextTypeProvider.DbContextType, 
     model 
    }); 

    Type routeTypeWrapper = typeof(RouteTypeWrapper<>).MakeGenericType(new Type[] { 
     catchallRoute 
    }); 

    RouteTypeProvider routeTypeProvider = (RouteTypeProvider)Activator.CreateInstance(routeTypeWrapper); 

    return GetRoute(databaseContextTypeProvider, model, routeTypeProvider); 
} 
+1

'typeof(RouteTypeWrapper <>)'返回開放的泛型類型。 'RouteTypeWrapper <>'。 MakeGenericType返回關閉的泛型類型'RouteTypeWrapper ,SiteTree >>'。您的代碼中的問題是,MakeGenericType的結果被丟棄,而不是放入變量routeTypeWrapper – Grax 2015-04-02 16:08:54

1

下面是顯示如何做到這一點的簡單示例。

class A<T>{} 
class B<T>{} 
class C<T>{} 

... 

var atype = typeof(A<>).MakeGenericType(new [] { typeof(int) }); 
var btype = typeof(B<>).MakeGenericType(new [] { atype }); 
var ctype = typeof(C<>).MakeGenericType(new [] { btype }); 

var cinstance = Activator.CreateInstance(ctype);