C# 如何获取项目元素的名称?

C# 如何获取项目元素的名称?,c#,visual-studio-2010,refactoring,C#,Visual Studio 2010,Refactoring,我对内置功能或解决方案都感兴趣,这无关紧要 我的问题类似于“如何获取对象的字段/属性的名称”——因此您无法编写 "MyField" 不再是了,但是 NameOf(MyField) 现在,再上一层--您没有一个类,而是一个项目,不是一个字段,而是项目的元素--报表、数据集等等。我想从写作转向: LoadReport("MyReport.rdlc"); 到 当然,这是一个粗略的想法 如果您想知道为什么--因为在重构时,我希望自动替换所有名称

我对内置功能或解决方案都感兴趣,这无关紧要

我的问题类似于“如何获取对象的字段/属性的名称”——因此您无法编写

  "MyField" 
不再是了,但是

  NameOf(MyField)
现在,再上一层--您没有一个类,而是一个项目,不是一个字段,而是项目的元素--报表、数据集等等。我想从写作转向:

  LoadReport("MyReport.rdlc");

当然,这是一个粗略的想法

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

问题是——这可能吗?如果可能,怎么可能?

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

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


    您可以查看一下,但是如果您想像Project.MyReport一样使用它,请编写您自己的带有映射的类。

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

    我想这可能就是您正在寻找的(反射)

    要在运行时访问程序本身,请执行以下操作:

    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
    }
    

    我希望这有帮助:)

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

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

    下面的代码是一个简单的示例,说明了这可能是什么样子:

    属性声明(必须在“主”项目中):

    设置要查找的项目的属性(Properties/AssemblyInfo.cs将是一个很好的位置):

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

    var reportPlugins = AppDomain.CurrentDomain
        .GetAssemblies()
        .Where(a => a.GetCustomAttributes(typeof(ReportPluginAttribute), false).Any())
    
    foreach (reportPluginAssembly in reportPlugins)
        LoadReport(reportPluginAssembly.GetName().Name+".rdlc");
    

    我不太确定你的
    LoadReport
    函数应该做什么。所有这些假定的特定于项目的报告都可以通过一种方法使用吗?如果必须从插件内部通过代码加载它们,您可以扩展属性以携带用于加载报告的类的信息。

    非常感谢,这似乎比我想象的要困难,因为项目不是每个项目的子类型,所以所有信息都在运行时可用,而不是在设计时。我会挖得更深,无论如何谢谢你!你怎么称呼这样的名字?我迷路了--你怎么给报表设置属性?第二,你如何为你的报告命名?你必须有某种符号名称。实际上你给出了一个很好的答案,但没有答案:-)你/我所能做的就是迭代某些元素,但你不能通过符号名称引用报表。一种解决方案是为属性设置一个标签,然后(通过属性)获取报告,哪个标签是a、B或C,依此类推。但这将增加更多的问题,以保持所有的“参考”最新。谢谢你的回答!谢谢,但要列出*.rdlc,您不必使用反射。但它不那么重要——假设您已经有了这样的列表,那么您将如何处理它?如何使用符号名获取此“MyReport”?
    [AttributeUsage(AttributeTargets.Assembly)]
    public sealed class ReportPluginAttribute : Attribute { }
    
    [assembly: ReportPluginAttribute()]
    
    var reportPlugins = AppDomain.CurrentDomain
        .GetAssemblies()
        .Where(a => a.GetCustomAttributes(typeof(ReportPluginAttribute), false).Any())
    
    foreach (reportPluginAssembly in reportPlugins)
        LoadReport(reportPluginAssembly.GetName().Name+".rdlc");