语法层面不支持,变通的做法: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);
}
}
}
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);
}
}
}
你根本不涉及反射,直接new GameGateway就好了吗
GateWay<GameRequestData>和GateWay<RequestData>没有继承关系。见:
泛型中的协变和逆变(中的Invariant部分)
http://msdn.microsoft.com/zh-cn/library/dd799517%28v=vs.110%29.aspx
{
}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>是一样的。
Type undefineGenericType = typeof(GetterSetterWrapper<,>);
Type instanceType = undefineGenericType.MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType); //返回实现IPropertyAccess接口的实例
object propertyAccess = Activator.CreateInstance(instanceType, propertyInfo);仅供参考