语法层面不支持,变通的做法:using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{
    class RequestData
    {
    }    class GameRequestData : RequestData
    {
    }    class DBRequestData : RequestData
    {
    }    class Gateway<TRequestData>
        where TRequestData : RequestData
    {
    }    class GameGateway : Gateway<GameRequestData>
    {
        public static explicit operator Gateway<RequestData>(GameGateway instance)
        {
            var result = new Gateway<RequestData>();
            // 在这里添加拷贝属性的逻辑
            return result;
        }
    }    class DBGateway : Gateway<DBRequestData>
    {
    }    class Program
    {
        static void Main(string[] args)
        {
            // game是空值
            Gateway<RequestData> game = (Gateway<RequestData>)Activator.CreateInstance<GameGateway>();
            Console.WriteLine(game == null);
        }
    }
}

解决方案 »

  1.   

    CreateInstance是反射的时候用的
    你根本不涉及反射,直接new GameGateway就好了吗
      

  2.   

    先判断一下CreateInstance的值是否null
      

  3.   

    可能你要更改思路了。因为虽然GameRequestData继承于RequestData,
    GateWay<GameRequestData>和GateWay<RequestData>没有继承关系。见:
    泛型中的协变和逆变(中的Invariant部分)
    http://msdn.microsoft.com/zh-cn/library/dd799517%28v=vs.110%29.aspx
      

  4.   

    你的需求应该是想把他们作为统一的类型,有个办法,是通过一个接口给它们"添加"一个统一类型,为了演示代码,我添加了一个Data属性:class RequestData
    {
    }class GameRequestData : RequestData
    {
    }class DBRequestData : RequestData
    {
    }interface IGateway
    {
        RequestData Data { get; set; }
    }class Gateway<TRequestData> : IGateway where TRequestData : RequestData
    {
        RequestData IGateway.Data
        {
            get { return Data; }
            set { Data = (TRequestData)value; }
        }    public TRequestData Data { get; set; }
    }class GameGateway : Gateway<GameRequestData>
    {
    }class DBGateway : Gateway<DBRequestData>
    {
    }class GenericTest
    {
        public GenericTest()
        {
            var game = Activator.CreateInstance(typeof(GameGateway)) as IGateway;
            var db = Activator.CreateInstance(typeof(DBGateway)) as IGateway;
        }
    }像这样,把Gateway<TRequestData>中需要暴露的东西定义到IGateway中,Gateway<TRequestData>实现IGateway。就拥有统一的类型IGateway了,因为暴露的东西一致,和你想用的Gateway<RequestData>是一样的。
      

  5.   

    //methodInfo为非静态方法时,根据DeclaringType和PropertyType,制定GetterSetterWrapper<,>具体类型。 
                Type undefineGenericType = typeof(GetterSetterWrapper<,>);
                Type instanceType = undefineGenericType.MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType);            //返回实现IPropertyAccess接口的实例
                object propertyAccess = Activator.CreateInstance(instanceType, propertyInfo);仅供参考