Как получить название элемента проекта? - PullRequest
0 голосов
/ 12 марта 2011

Меня интересует как встроенная функция, так и обходной путь, это не имеет значения.

Моя проблема похожа на вопрос «как получить имя поля / свойства объекта» - поэтому вы не могли написать

  "MyField" 

больше, но

  NameOf(MyField)

Теперь на один уровень выше - и у вас есть не класс, а проект, и не поле, а элемент проекта - отчет, набор данных и т. Д. Я хотел бы перейти от написания:

  LoadReport("MyReport.rdlc");

до

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

Конечно, это грубая идея.

Если вам интересно, почему - потому что при рефакторинге я бы хотел, чтобы все имена были заменены автоматически.

Вопрос в том - возможно ли это, и если да - как?

Редактирование

  1. Обратите внимание, что рефакторинг выполняется во время разработки, поэтому получение фактического имени можно выполнить во время выполнения, но привязка к нему должна выполняться во время разработки, а не во время выполнения (поэтому исключается чистое отражение).

Ответы [ 5 ]

1 голос
/ 12 марта 2011

Вы можете проверить во время выполнения, какие сборки загружены (поскольку каждый проект является сборкой) с помощью AppDomain.CurrentDomain.GetAssemblies().Вы можете добавить атрибут ко всем сборкам, а затем отфильтровать список сборок, чтобы он содержал только сборки с этим атрибутом.Это даст вам список всех ваших текущих (во время выполнения) загруженных сборок.

--- Изменить, чтобы ответить на комментарий ---

Следующий код является быстрым примером того, как этоможет выглядеть так:

Объявление атрибута (должно быть в «основном» проекте):

[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.Можно ли использовать все эти предположительно специфичные для проекта отчеты одним методом?Если они должны быть загружены кодом изнутри плагина, вы можете расширить Атрибут для переноса информации, какой класс использовать для загрузки отчета.

1 голос
/ 12 марта 2011

Вы можете взглянуть на Получить список файлов решений / проектов для надстройки VS или плагина DXCore , но если вы хотите использовать его как Project.MyReport, напишите свой собственный класс с сопоставлениями.

0 голосов
/ 12 марта 2011

Я думаю, это может быть то, что вы ищете (отражение).

Чтобы получить доступ к самой программе во время выполнения:

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
}

Надеюсь, это поможет:)

0 голосов
/ 12 марта 2011

Почему бы не использовать отражение и не получить имя сборки и / или класса и сохранить их в статическом кэше?

0 голосов
/ 12 марта 2011

Думаю, вам нужно будет использовать отражение и класс PropertyInfo:

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

...