C# 如何使代码可扩展以供将来使用

C# 如何使代码可扩展以供将来使用,c#,C#,我正在尝试构建我的代码,以便将来可以轻松地扩展它,但是我认为我想得太多了,并且正在努力实现这一点 我的设想是: 根据传递给我的一些数据,我需要生成一个类。 我需要生成的类在本质上与其他任何类都不相似 例如,我有几个可以创建的类: public class File1{ public string Name {get;set;} // etc... } public class File2{ public int ID {get;set;} // etc... } pu

我正在尝试构建我的代码,以便将来可以轻松地扩展它,但是我认为我想得太多了,并且正在努力实现这一点

我的设想是: 根据传递给我的一些数据,我需要生成一个类。 我需要生成的类在本质上与其他任何类都不相似

例如,我有几个可以创建的类:

public class File1{
   public string Name {get;set;}
   // etc...
} 
public class File2{
   public int ID {get;set;}
   // etc...
} 
public class File3{
   public string MyType {get;set;}
   // etc...
} 
在我的主要课程中,我有:

switch (myExtension)
            {
                case ".abc":
                    ProcessABC(myContents);
                    break;
                case ".def":
                    ProcessDEF(myContents);
                    break;
                case ".ghi":
                    ProcessGHIL(myContents);
                    break;
               //etc...
            }
我已尝试使用常用方法创建接口:

public ProccessStuff(data);
但我不认为这会起作用,因为我没有一个通用的返回类型

然后我想到了一个抽象类,但接下来我似乎要在这个抽象类中投入大量的工作

public abstract class MyAbstractClass 
{
    public void ProcessStuff(string data)
    {
        // Parse the data into an object

        // Update some DB fields

        // Log some data
    }
}

仅仅创建一个抽象类来处理我所有的逻辑,我的做法正确吗?

你是说这些类没有任何相似之处。但事实并非如此——它们都需要一个
字符串
来进行一些处理,而这正是您希望在类之间共享的

制作一个接口,
IDataProcessor
(或其他)。在这里,有一个方法-
voidprocess(string)
。文件类将以它们需要的方式实现该方法

这会将主类
开关
更改为简单的

IDataProcessor actualDataProcessor = ...;

actualDataProcessor.Process(myContents);

当然,您仍然需要一些方法来根据扩展创建适当的
IDataProcessor
。根据您的具体需要,一本简单的
词典
可能就足够了。否则,如果您愿意,还有很多其他方法可以更动态地绑定类,或者使用显式工厂类。

您尝试过使用泛型吗? 以下是一个例子:

public void Process<T>(string contents)
    where T : IProcessStuff, new ()
{
    // Common work to do here
    // ...

    // Specific processing stuff
    T t = new T();
    t.ProcessStuf(contents);
}

public interface IProcessStuff
{
    void ProcessStuf(string contents);
}
公共作废流程(字符串内容)
其中T:IProcessStuff,new()
{
//这里的日常工作
// ...
//特殊加工材料
T=新的T();
t、 过程(内容);
}
公共接口IProcessStuff
{
void ProcessStuf(字符串内容);
}

您所说的:非通用返回类型是什么意思?如果您没有通用返回类型,为什么不同时返回一个接口?File1 a=ProcessABC(myContents);file2b=ProcessDEF(myContents);File3 c=ProcessGHIL(myContents);我相信这就是我被卡住的地方。我开始创建一个接口,但对我来说,它所完成的只是修改一些switch语句。(即case.abc“IMyInterface myInterace=new File1();myInterface.Process(data);)@JDS是的,但这是不可避免的(尽管它可以通过元数据或基于约定的配置等“自动化”)。关键是,只有工厂(或配置)本身需要知道这一点——代码的其余部分将始终只使用接口。最后,当您处理任何非抽象的东西时,接口无论如何都不会帮助您-如果您以后需要从类中读取数据,您需要在编译时知道正确的类型。要么确保接口支付租金,要么放弃:)