WCF 不支持泛型协议 及 通过父类给子类赋值 通过反射加工
WCF 不支持泛型协议及通过父类给子类赋值,解决办法,需要反射进行赋值
Model
[DataContract] [KnownType(typeof(Test1))] public class BaseTest { [DataMember] public int BaseTest_Index { get; set; } } [DataContract] public class Test1 : BaseTest { [DataMember] public int Test1_Index { get; set; } }
Server
public interface ITestServer { void Test(BaseTest baseTest); } public class TestServer : ITestServer { public void Test(BaseTest baseTest) { //运用反射进行调用 using (ServerManager serverManager = new ServerManager(new SqlConnection("数据库连接字符串"))) { //通过反射读取方法,并获取类型 MethodInfo methodInfo = serverManager.GetType().GetMethod("Test").MakeGenericMethod(baseTest.GetType()); //调用方法。。。。。 //如果是多个参数 new object{baseTest, , , , ,} 严格按着顺序来 methodInfo.Invoke(serverManager, new[] {baseTest}); } } } public class ServerManager:IDisposable { protected IDbConnection _db ; public ServerManager(IDbConnection db) { this._db = db; } public void Test<T>(BaseTest baseTest) where T:BaseTest,new() { //........// } public void Dispose() { _db.Dispose(); } }
Client ,这边选用伪代码来说明,并 通过父类给子类赋值
public class Client { //.......// public BaseTest basetest = new Test1(); public void Basetest(BaseTest baseTest) { //通过反射,从父类中获取子类属性,并进行赋值 PropertyInfo property = baseTest.GetType().GetProperties().FirstOrDefault(t=>t.Name =="Test1_Index"); //赋新值 property.SetValue(baseTest,1); //伪代码 TestServer server = new TestServer(); server.Test(baseTest); // } //.......// }