我有一个Variable类和3个子类:VariableBool,VariableLong和VariableDouble。每个子类仅定义后缀类型的值成员。
现在,我需要通过WCF基于这些类传输对象。我有多个客户端将他们的变量注册到服务器。每当一个客户端上的值发生更改时,它就会在所有其他客户端中更新。
我的问题是:有办法吗?
someVar.Value = anotherVar.Value;
无论何种类型,都不需要检查类型,例如:
VariableBool anotherVarBool = anotherVar as VariableBool;
if (anotherVarBool != null) {
(someVar as VariableBool).Value = anotherVar.Value;
}
// check other types...
我错过了什么?是否有某种类型的模式?我能用反射吗? 另外,我不认为我可以使用Generics因为WCF(我已经尝试但我可以使它工作)。
由于
答案 0 :(得分:1)
如果您正在使用mex生成的WCF代理,那么我怀疑反射(或ComponentModel)确实是最简单的选项 - 如:
public static void Copy<T>(T source, T destination,
string propertyName) {
PropertyInfo prop = typeof(T).GetProperty(propertyName);
prop.SetValue(destination, prop.GetValue(source, null), null);
}
或者如果你想使用变量类型作为基类:
public static void Copy(object source, object destination,
string propertyName) {
PropertyInfo sourceProp = source.GetType().GetProperty(propertyName);
PropertyInfo destProp = destination.GetType().GetProperty(propertyName);
destProp.SetValue(destination, sourceProp.GetValue(source, null), null);
}
答案 1 :(得分:1)
为什么不将Value成员放在基类Variable中。 在那种情况下,
public void UpdateValue( Variable variable )
{
if( variable != null )
// do something with variable.Value
}
但是,如果你真的想使用继承,你需要通过使用KnownType属性及其方法告诉基类什么是子类型
[DataContract()]
[KnownType( "GetKnownType" )]
public class Variable
{
public object Value;
private static Type[] GetKnownType()
{
// properties
return new []{ typeof(VariableBool),
typeof(VariableLong),
typeof(VariableDouble),};
}
}
[DataContract()]
public class VariableBool : Variable
{
}
[DataContract()]
public class VariableLong : Variable
{
}
[DataContract()]
public class VariableDouble : Variable
{
}