Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Oop_C# 4.0_Design Patterns - Fatal编程技术网

C# 如何避免反思?

C# 如何避免反思?,c#,oop,c#-4.0,design-patterns,C#,Oop,C# 4.0,Design Patterns,我用MyClassA和MyClassB实现了抽象类BaseClass。用户可以扩展或使用这两个子类,例如,他只创建UserExtensionClassA,并按原样使用MyClassB。有一个类ClassC负责初始化这些类。它接收配置(例如,包含所需实现类的完整类名),并决定何时以及是否初始化这些类(例如,已有3个BaseClassimplementations=>拒绝创建请求的现有实例) 问题:如何避免示例中的反射ClassC可以从配置中的名称创建类。但我仍然可以更改库实现中的几乎所有内容,我不

我用
MyClassA
MyClassB
实现了抽象类
BaseClass
。用户可以扩展或使用这两个子类,例如,他只创建
UserExtensionClassA
,并按原样使用
MyClassB
。有一个类
ClassC
负责初始化这些类。它接收配置(例如,包含所需实现类的完整类名),并决定何时以及是否初始化这些类(例如,已有3个
BaseClass
implementations=>拒绝创建请求的现有实例)


问题:如何避免示例中的反射
ClassC
可以从配置中的名称创建类。但我仍然可以更改库实现中的几乎所有内容,我不喜欢反射的东西。

我建议不要运行自己的,而是依赖现有的IoC(控制反转)容器,如Autofac,因为这给了您高度的灵活性,同时也方便了依赖项注入(DI)等设计概念和控制反转(IoC)

大多数IoC容器提供编程接口以及基于JSON/XML文件的配置支持,包括:

Autofac配置文件示例:

{
    "defaultAssembly": "Autofac.Example.Calculator",
    "components": [
        {
            "type": "Autofac.Example.Calculator.Addition.Add, Autofac.Example.Calculator.Addition",
            "services": [
                {
                    "type": "Autofac.Example.Calculator.Api.IOperation"
                }
            ],
            "injectProperties": true
        },
        {
            "type": "Autofac.Example.Calculator.Division.Divide, Autofac.Example.Calculator.Division",
            "services": [
                {
                    "type": "Autofac.Example.Calculator.Api.IOperation"
                }
            ],
            "parameters": {
                "places": 4
            }
        }
    ]
}
构建容器:

// Add the configuration to the ConfigurationBuilder.
var config = new ConfigurationBuilder();
config.AddJsonFile("autofac.json");

// Register the ConfigurationModule with Autofac.
var module = new ConfigurationModule(config.Build());
var builder = new ContainerBuilder();
builder.RegisterModule(module);

这是混乱的,请张贴一些代码来澄清情况。此外,反思似乎不是一个坏的解决方案…请张贴你已经尝试了什么?帮助很多。为什么不写代码而不是写“我有一个抽象类基类和MyClassA和MyClassB实现”?不清楚为什么以及如何使用反射(配置是字典?),您能展示一下吗?以及想要的伪代码。但一般来说,像“我不喜欢反思的东西”这样的理由是不合理的。您是读取配置一次还是1234567次?您是否遇到性能/内存问题?