Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码?_C#_Wcf - Fatal编程技术网

C# 有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码?

C# 有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码?,c#,wcf,C#,Wcf,我有这个可怕的代码,我一直在努力改进,但没有成功的WCF服务 在服务器端,我有此合同: [ServiceContract] public interface IOhmioService { [OperationContract] IEnumerable<Enumerador> GetEnumerador(string sClassType); } 想法是这样的:我有几个类在其中实现这个接口: public class Enumerador {

我有这个可怕的代码,我一直在努力改进,但没有成功的WCF服务

在服务器端,我有此合同:

[ServiceContract]    
public interface IOhmioService
{
    [OperationContract]        
    IEnumerable<Enumerador> GetEnumerador(string sClassType);
}
想法是这样的:我有几个类在其中实现这个接口:

public class Enumerador
{
    public int ID{ get; set; }
    public string Description{ get; set; }
}

public interface IEnumerador
{
    IEnumerable<Enumerador> Enumerar();
}
公共类枚举器
{
公共int ID{get;set;}
公共字符串说明{get;set;}
}
公共接口IEnumerador
{
IEnumerable枚举器();
}
我想要的是,客户机可以决定要枚举哪个对象。问题是我不能直接发送类型,因为它不可序列化,所以它不会通过WCF服务


因此,如何创建一个服务方法,客户机可以在其中决定要枚举的对象(返回的类型始终为Enumerador)。我知道如果不在WCF上指定类型,我就无法发送数据,因为SOAP不支持它,但我只需要一种方法来告诉服务器要创建哪个对象

创建一个接口,并让所有类(即客户、供应商)实现它。然后将接口传递给方法,而不是字符串。然后创建一个对象并进行编码。请查找以下代码:

public interface ISample
{
    IList<string> GetData();
}

public class Sample1 :ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Tom");
        names.Add("Peter");
        return names;
    }
}
public class Sample2 : ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Human");
        names.Add("Immortal");
        return names;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var c1 = new CalledClass();
        IList<string> data = c1.GetData(new Sample2());
        foreach (var name in data)
        {
            Console.WriteLine(name);
        }
        Console.ReadLine();
    }
}
公共接口很简单
{
IList GetData();
}
公共类示例1:ISample
{
公共IList GetData()
{
IList names=新列表();
姓名。加上(“汤姆”);
姓名。添加(“彼得”);
返回姓名;
}
}
公共类样本2:ISample
{
公共IList GetData()
{
IList names=新列表();
名称。添加(“人类”);
名称。添加(“不朽”);
返回姓名;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var c1=新调用的类();
IList data=c1.GetData(new Sample2());
foreach(数据中的变量名称)
{
Console.WriteLine(名称);
}
Console.ReadLine();
}
}

希望这有帮助。如果您需要更多信息,请告诉我。

从可用性的角度来看,我确实认为通过web服务API公开GetClientes()和GetVendedores()的单独方法可以让事情变得更加清晰和用户友好,而不是调用一个传递调用方所需字符串的方法。您仍然可以让这些单独方法的实现调用一个泛型方法来返回IEnumerable,并让客户机和供应商从Enumerador派生以保持服务器端的整洁。既然方法“GetEnumerador”的目的只是创建类的新对象,为什么我们不能将其放在客户端?谢谢@yyou。这只是因为客户机对数据库对象和实现Enumerador的类一无所知,Enumerador是从数据层的实体框架派生的。感谢您花时间@不朽。实际上,我的代码和你写的非常接近。我创建了一个接口(IEnumerador),并在客户机和供应商类上实现它。现在的问题是,我需要创建一个方法,该方法返回IENumerador的集合,该集合可能来自客户机或供应商在客户机调用时进行的暂挂。如果WCF不在两者之间,我可以这样做:public IEnumerable GetEnumerador(类型),但我不会使用WCF。
public class Enumerador
{
    public int ID{ get; set; }
    public string Description{ get; set; }
}

public interface IEnumerador
{
    IEnumerable<Enumerador> Enumerar();
}
public interface ISample
{
    IList<string> GetData();
}

public class Sample1 :ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Tom");
        names.Add("Peter");
        return names;
    }
}
public class Sample2 : ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Human");
        names.Add("Immortal");
        return names;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var c1 = new CalledClass();
        IList<string> data = c1.GetData(new Sample2());
        foreach (var name in data)
        {
            Console.WriteLine(name);
        }
        Console.ReadLine();
    }
}