如何获得项目元素的名称?

时间:2011-03-12 11:48:09

标签: c# visual-studio-2010 refactoring

我对内置功能或解决方法感兴趣,无所谓。

我的问题类似于“如何获取对象的字段/属性的名称”这一问题 - 所以你不能写

  "MyField" 

,但是

  NameOf(MyField)

现在,升级一级 - 你没有一个类,而是一个项目,而不是一个字段,而是项目的元素 - 报告,数据集等。我想转而写作:

  LoadReport("MyReport.rdlc");

  LoadReport(NameOf(Project.MyReport)+".rdlc");

当然这是个粗略的想法。

如果您想知道为什么 - 因为在重构时,我希望自动替换所有名称。

问题是 - 这是可能的,如果是的话 - 怎么样?

编辑

  1. 请注意重构是在设计时完成的,因此获取实际名称可以在运行时完成,但绑定到它必须在设计时完成,而不是在运行时(因此排除了纯粹的反射)。

5 个答案:

答案 0 :(得分:1)

您可以查看Get a list of Solution/Project Files for VS Add-in or DXCore Plugin,但如果您想像Project.MyReport那样使用它,请使用映射编写您自己的类。

答案 1 :(得分:1)

您可以在运行时检查加载了哪些程序集(因为每个项目都是程序集)AppDomain.CurrentDomain.GetAssemblies()。您可以向所有程序集添加属性,然后筛选程序集列表以仅包含具有此属性的程序集。这将为您提供所有当前(在运行时)加载的程序集的列表。

---编辑回答评论---

以下代码是一个快速示例,说明了它的外观:

属性声明(必须在'main'项目中):

[AttributeUsage(AttributeTargets.Assembly)]
public sealed class ReportPluginAttribute : Attribute { }

在您要查找的项目上设置属性(Properties / AssemblyInfo.cs将是一个好地方):

[assembly: ReportPluginAttribute()]

现在您可以检查这些程序集:

var reportPlugins = AppDomain.CurrentDomain
    .GetAssemblies()
    .Where(a => a.GetCustomAttributes(typeof(ReportPluginAttribute), false).Any())

foreach (reportPluginAssembly in reportPlugins)
    LoadReport(reportPluginAssembly.GetName().Name+".rdlc");

我不太确定你的LoadReport函数应该做什么。所有那些据称是项目特定的报告是否可以通过单一方法使用?如果必须通过插件内部的代码加载它们,则可以扩展Attribute以携带用于加载报告的类的信息。

答案 2 :(得分:0)

认为您需要使用反射和PropertyInfo类:

http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

答案 3 :(得分:0)

为什么不使用反射并获取程序集和/或类的名称并将它们存储在静态缓存中?

答案 4 :(得分:0)

我认为这可能是你正在寻找的东西(反思)。

要在运行时访问程序本身:

Assembly assembly = Assembly.GetExecutingAssembly();

或者更具体地说,访问项目目录中的文件:

DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); // access the main project folder

if (di != null)
{
    FileInfo[] subFiles = di.GetFiles("*.rdlc"); // get only the files with extention  rdlc, later you can output them using a foreach loop
}

我希望有帮助:)