Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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# 迭代每个对象的对象列表、实例化和调用方法,而不显式创建所有对象_C#_Wcf - Fatal编程技术网

C# 迭代每个对象的对象列表、实例化和调用方法,而不显式创建所有对象

C# 迭代每个对象的对象列表、实例化和调用方法,而不显式创建所有对象,c#,wcf,C#,Wcf,假设我在一个WCF服务中有一堆类要向使用者公开。此列表在WCF服务内名为clsServiceEnumertion.ListOfServices(返回字典(字符串,布尔值))的方法中枚举。可用包装类的列表存储在此服务枚举中的枚举中,它们的枚举方式与类名相同(例如clsEmailWrapper、clsPDFGenerator等)。通过这种方式,我们可以将可重用对象作为服务公开给多个内部托管网站(和内部软件),而无需重写大量代码、复制代码、单点更新等 在任何给定的时间,这些包装类的可用性都可能不可用(

假设我在一个WCF服务中有一堆类要向使用者公开。此列表在WCF服务内名为clsServiceEnumertion.ListOfServices(返回字典(字符串,布尔值))的方法中枚举。可用包装类的列表存储在此服务枚举中的枚举中,它们的枚举方式与类名相同(例如clsEmailWrapper、clsPDFGenerator等)。通过这种方式,我们可以将可重用对象作为服务公开给多个内部托管网站(和内部软件),而无需重写大量代码、复制代码、单点更新等

在任何给定的时间,这些包装类的可用性都可能不可用(由于维护、bug、中断等原因)。这由用户在配置应用程序中控制。我们也不会提前知道将有多少服务或它们将被称为什么(一年后可能会有50个)。可用的服务(如果已启用)存储在xml文件中,并以字典(字符串、布尔值)的形式对系统进行分类

听起来像是利用布尔值的迭代器的主要候选对象。问题:我只有对服务类的字符串引用,这些引用恰好与有用但命名为可描述的绑定类相同

我知道反射和激活器,但它不能正确地组合到我的头脑中。有人能帮助我遍历这个字典吗?如果布尔值为true,则以字符串形式获取类名,创建该类型的对象并调用将存在于所有包装类中的.Test方法(测试方法是确保服务可以运行并返回布尔值,而迭代器本身将在字典(字符串,布尔值)中存储类名和结果)

除了实际编写的迭代器,我什么都有

  public Dictionary<string, Boolean> TestEnabledServices(Dictionary<string, Boolean> listOfEnabledServices)
    {
        Dictionary<string, Boolean> resultSet = new Dictionary<string, bool>();
        foreach (KeyValuePair<string, Boolean> pair in listOfEnabledServices)
        {
            if (pair.Value)
            {
                Boolean retVal = false;
                //TODO: actual test here
                retVal = true ? true : false; //the result of the test...

                resultSet.Add(pair.Key, retVal);
            }//end if
        }//end foreach

        return resultSet;
    }//end TestEnabledService
公共字典TestEnabledServices(字典列表TestEnabledServices)
{
Dictionary resultSet=新建字典();
foreach(listOfEnabledServices中的KeyValuePair对)
{
if(pair.Value)
{
布尔retVal=false;
//TODO:这里进行实际测试
retVal=true?true:false;//测试结果。。。
resultSet.Add(pair.Key,retVal);
}//如果结束
}//端部foreach
返回结果集;
}//结束可测试服务

我想这就是你想要的

Dictionary<string, bool> GetEnabledAndTestedServices(Dictionary<string, bool> input)
{
    var testedServices = new Dictionary<string, bool>();
    foreach(var kvp in input)
    {
        if(!kvp.Value) //disabled
            continue;

        var type = Type.GetType(kvp.Key);

        if(type == null)
            throw new Exception("This service does not exist!");

        var instance = Activator.CreateInstance(type);

        // if the Test() method is part of an interface
        // public interface ITestableService { bool Test() }
        // and it's implemented by all services we can do this:
        var service = instance as ITestableService;
        if(service != null)
        {
            if(service.Test())
                testedServices.Add(kvp.Key, true);
        } 
        else //Otherwise we call it via reflection, you could also do dynamic
        {
            var testMethod = type.GetMethod("Test");
            if(testMethod == null)
                throw new Exception("The service is not testable");

            var testResult = testMethod.Invoke(instance, null) as bool?;
            if(testResult.HasValue && testResult.Value)
                testedServices.Add(kvp.Key, true);
        }
    }

    return testedServices;
}
Dictionary GetEnabledTestedService(字典输入)
{
var testedServices=新字典();
foreach(输入中的var kvp)
{
如果(!kvp.Value)//已禁用
继续;
var type=type.GetType(kvp.Key);
if(type==null)
抛出新异常(“此服务不存在!”);
var instance=Activator.CreateInstance(类型);
//如果Test()方法是接口的一部分
//公共接口ITestableService{bool Test()}
//它由所有服务实现,我们可以做到这一点:
var service=实例作为ITestableService;
if(服务!=null)
{
if(service.Test())
testedServices.Add(kvp.Key,true);
} 
否则//否则我们称之为通过反射,您也可以执行动态
{
var testMethod=type.GetMethod(“测试”);
if(testMethod==null)
抛出新异常(“服务不可测试”);
var testResult=testMethod.Invoke(实例,null)作为bool?;
if(testResult.HasValue&&testResult.Value)
testedServices.Add(kvp.Key,true);
}
}
返回测试服务;
}

太快了!哇,谢谢。我要打开这个,看看它是否有效。我会发回结果。再次感谢。很好,很好,很好。我唯一的问题是“包装好了”类位于名为Wrappers的文件夹中,因此,名称空间是ServiceLibrary.Wrappers。如果我将类文件放在项目的根目录中,并将其名称空间更改为“ServiceLibrary”和“ServiceLibrary”。+kvp.Key,它可以工作。如果我将其放回Wrappers文件夹并将其名称空间更改为“ServiceLibrary.Wrappers"然后将代码更改为ServiceLibrary.Wrappers+kvp.Key。请说服您给我一个提示?谢谢!文件夹应该不重要,但名称空间重要。您需要类的全名。您可以做的只是转到保存内容的文件夹的属性,并将名称空间提供程序更改为
false
先生,您真是不可思议。要在我学习文件夹与名称空间的那天…我一直认为您需要将文件夹作为名称空间的一部分。在将其放回到没有.Wrappers名称空间的文件夹中之后,它就可以工作了。值得注意的是,类需要有无参数构造函数,但考虑到wcf服务上下文,这实际上在hte列表中。我我会投票支持你的回答,但显然我需要一些堆积如山的信誉,更常用的是声誉。老兄,再次感谢。