我是C#的新手,我在WCF应用程序中遇到DataMember问题:
有问题的DataMember是实现接口的类的实例列表,让我们在“assemblyA”中调用此类“classA”,实现“interfaceA”。
通过WCF从服务器传递到客户端的“主”数据对象(具有此DataMember)被定义为“classB”,位于程序集“assemblyB”中,在服务器和客户端中都引用它。
AssemblyB 对assemblyA的反对。到目前为止一切都很好。
现在客户端(在“assemblyC”中)连接到通过WCF传递assemblyB DataContract对象的服务,但是asseblyC没有对assemblyA的引用(并且不应该有!)。一切都还可以,序列化和反序列化工作正常,但是:
当我尝试在assemblyC中使用 classA对象时,C#抱怨它不知道类型。
有没有办法在不引用assemblyA的情况下将interfaceA导入assemblyC?我尝试在C中定义一个继承自intefaceA(“interfaceCA”)的接口并转换为assemblyC中的接口......但是没有运气,C#仍然抱怨缺少对assemblyA的引用。
我无法将interfaceA从assemblyA移动到assemblyB,因为assemblyA必须在没有对assemblyB的引用的情况下工作,并且我不想在assemblyC中引用assemblyA,因为assemblyC甚至不应该知道assemblyA ...除了那个数据成员。 据我所知,在C#中,我无法强制转换为assemblyB中定义的interfaceA的副本 ...所以,任何人都知道如何将它传递给assemblyC?
让我们为您提供一个简单的伪代码片段用于演示目的:
// assemblyA
public interface iA
{
string Stuff { get; }
}
[DataContract]
public class A : iA
{
[DataMember]
public string Stuff { get { return "Stuff"; } }
}
// assemblyB, references assemblyA
[DataContract]
public class B
{
[DataMember]
public int Num { get; protected set; }
[DataMember]
public List<A> StuffContainers { get; protected set; }
}
// assemblyC, references assemblyB
public class C
{
public void ReceiveData(B data)
{
Console.WriteLine(data.Num); // all fine
// the following line shows an error
foreach (var stuffContainer in data.StuffContainers)
{
Console.WriteLine(stuffContainer.Stuff);
}
// same here, of course since C# can't resolve namespaceA and/or iA
foreach (namespaceA.iA stuffContainer in data.StuffContainers)
{
Console.WriteLine(stuffContainer.Stuff);
}
// same here of course
List<namespaceA.iA> sC = (List<namespaceA.iA>)data.StuffContainers;
foreach (namespaceA.iA stuffContainer in sC)
{
Console.WriteLine(stuffContainer.Stuff);
}
}
}
希望这足以说清楚......这是我自己的第一个问题! ;)