【发布时间】:2014-12-06 21:43:48
【问题描述】:
我正在编写一个 DLL,它将公开这样的方法:
public static void Convert(string inputFile, string outputFile, FileType fileType)
目前,FileType 是这样公开的枚举:
public enum FileType
{
ConvertClassOne,
ConvertClassTwo,
ConvertClassThree
}
这将表示可以转换给定类型文件的每个类。我将有几个基于接口的不同类,每个类都可以处理特定类型的文件。
我不想像上面那样有一个枚举,每次我添加一个类时我都必须手动更改它,以便调用程序可以告诉我他们给我的文件类型,我想公开一个根据我的项目中具有给定属性的类自动更改自身的枚举。
所以如果我添加一个具有给定属性的类:
[SomeAttribute]
public class NewClassAdded()
{
}
FileType 枚举会选择这个并且调用程序将能够看到
FileType.NewClassAdded
无需我手动更改任何其他内容。我很确定反射将允许我编写一个方法,该方法返回具有给定属性的每个类的名称,但我不确定具体如何,也不知道如何将这些名称公开为枚举。
谢谢,
安德鲁
【问题讨论】:
-
您几乎可以肯定不能通过反射来做到这一点,因为根据定义,那时代码必须已经编译。您需要某种预构建过程来执行此操作,类似于使用 AOP 实现所做的工作。
-
正如@Servy 所说,无论如何,您的“转换”例程都必须提前知道每种 FileType 类,才能在开关或 if/else if 块中使用枚举。所以,这种方法肯定不会“那么”有用(即使你设法做你想做的事,我认为即使使用反射也是不可能的(或容易的)。为什么不使用接口来处理“转换”并让每个 FileType 类都实现它,这样你的“转换”例程就不用担心细节了吗?
-
为什么不创建 T4 模板?检查这篇文章stackoverflow.com/questions/4395000/…
-
@Jauch 这不是问题。他正在编写一个类库。当他将代码添加到他的库时,他希望它自动添加到枚举中。他的库的使用者在编写代码时将使用已经构建的库以及所有实现。我的理解是图书馆的消费者并没有添加他们自己的转换器。
-
哦,我明白了,@Servy。在这种情况下,我不认为这样做的效用可以支付为此付出的努力。无论如何,假设目标是“定义”正确的转换方法,通过使用枚举,我认为最好改为使用接口,或者可能是带有一些虚拟方法的基类,并使代码通用和与 FileType 不同实现的数量无关。
标签: c# reflection enums attributes