当一个成员的类型不同时,将子类视为其超类

时间:2009-02-12 10:50:26

标签: c# .net wcf

我有一个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(我已经尝试但我可以使它工作)。

由于

2 个答案:

答案 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
{
}