Проблемы с поиском атрибута, прикрепленного к типу - PullRequest
0 голосов
/ 20 ноября 2008

При выполнении приведенного ниже кода тип никогда не возвращается, несмотря на наличие класса с назначенным правильным атрибутом. На самом деле массив attr всегда имеет длину 0.

Assembly a = Assembly.LoadFile(file);
foreach (Type t in a.GetTypes())
{
    object[] attr = t.GetCustomAttributes(typeof(SchemeNameAttribute), false);

    foreach (object attribute in attr)
    {
        SchemeNameAttribute schemeName = attribute as SchemeNameAttribute;
        if (schemeName != null && schemeName.Name.ToLower() == brickName.ToLower() )
        {
            return t;
        }
    }
}

если я изменю его на использование:

object[] attr = t.GetCustomAttributes(false);

затем он выбирает один пользовательский атрибут типа SchemeNameAttribute для типа, но

SchemeNameAttribute schemeName = attribute as SchemeNameAttribute;

всегда возвращает нулевое значение для имя_схемы.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2008

Вы смешали два разных контекста загрузки сборок: «Загрузить контекст», в котором работает ваше приложение, и «Нет контекста», в котором вы загружаете вторичную сборку с использованием LoadFile. Вы хотите прочитать эту и эту статьи, чтобы получить представление о загрузке контекстов. Самая важная часть здесь - это то, что сборки, загруженные в разные контексты, даже из одного места, считаются разными. И поэтому типы в них считаются разными. Таким образом, тип SchemeNameAttribute в вашей загруженной сборке отличается от типа SchemeNameAttribute в приложении.

0 голосов
/ 20 ноября 2008

Я подозреваю, что вы повторно объявили атрибут - то есть тип SchemeNameAttribute объявлен (отдельно) в двух сборках (возможно, путем копирования .cs). Это не будет работать; типы определяются областью их сборки, поэтому SchemeNameAttribute в Foo.dll отличается от SchemeNameAttribute в Bar.dll / Bar.exe.

Необходимо убедиться, что тип SchemeNameAttribute объявлен только один раз - при необходимости, перемещая его в dll, на которую могут ссылаться обе существующие сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...