2014-06-21 60 views
0

我正在调用一个用户定义类型作为参数的web服务。下面的代码工作正常,因为在调用服务的时候,类型强制转换(用于objectParameter)是使用已知类型完成的。对于未知类型如何将对象转换回原始类型?是否可以从要调用的方法的参数中获取类型信息,然后进行转换?序列化和动态类型转换

// web service proxy 
     Service1 ser=new Service1(); 


     CompositeType myCompositeType=new CompositeType(); 
     myCompositeType.StringValue = "arjun"; 

     IFormatter formatter = new BinaryFormatter(); 
     Stream stream = new FileStream(@"d:/MyFile.bin", 
           FileMode.Create, 
           FileAccess.Write, FileShare.None); 
     formatter.Serialize(stream, myCompositeType); 
     stream.Close(); 

     IFormatter formatter1 = new BinaryFormatter(); 
     Stream stream1 = new FileStream(@"d:/MyFile.bin", 
            FileMode.Open, 
            FileAccess.Read, 
            FileShare.Read); 

     object objectParameter= formatter1.Deserialize(stream1); 

     //call to remote webservice . casting is possible because the type is known 
     // it doesn't work: ser.GetDataUsingDataContract(objectParameter); 
     ser.GetDataUsingDataContract((CompositeType)objectParameter); 

回答

0

您可以选中“objectParameter的原始类型是这样的:

if (objectParameter is CompositeType) ser.GetDataUsingDataContract((CompositeType)objectParameter); 
if (objectParameter is CompositeType2) ser.GetDataUsingDataContract((CompositeType2)objectParameter); 

,但我认为这是更好的服务来检查“objectParameter”型 - 写一个基本方法GetDataUsingDataContract与对象参数类型,该基地方法内由原始参数类型调用另一个方法:

object objectParameter= formatter1.Deserialize(stream1); 
ser.GetDataUsingDataContract(objectParameter); 

...

GetDataUsingDataContract(object param) { 
    // calling method by original 'param' type 
    if (param is CompositeType) return GetDataUsingDataContract((CompositeType)param); 
    if (param is CompositeType2) return GetDataUsingDataContract((CompositeType2)param); 
    return null; 
} 
+0

你有两个已知的类compositeType和compositetype2是类型castted。什么如果你根本不知道类型信息。 – arjun