我对内置功能或解决方法感兴趣,无所谓。
我的问题类似于“如何获取对象的字段/属性的名称”这一问题 - 所以你不能写
"MyField"
,但是
NameOf(MyField)
现在,升级一级 - 你没有一个类,而是一个项目,而不是一个字段,而是项目的元素 - 报告,数据集等。我想转而写作:
LoadReport("MyReport.rdlc");
到
LoadReport(NameOf(Project.MyReport)+".rdlc");
当然这是个粗略的想法。
如果您想知道为什么 - 因为在重构时,我希望自动替换所有名称。
问题是 - 这是可能的,如果是的话 - 怎么样?
答案 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
}
我希望有帮助:)