Как я могу передать метод времени выполнения к пользовательскому атрибуту или жизнеспособному альтернативному подходу - PullRequest
2 голосов
/ 07 октября 2010

В принципе, я хотел бы сделать что-то подобное в начале моего класса (я знаю, что это не работает, поскольку это не константа) ....

[XmlStorage(IsSingleStorageFile = false, IsSubordinate = true, StorageLocation = "posts" + GetBlogId()]

Где GetBlogId () будет статическим служебным методом.

Я создаю среду хранения XML для движка блогов, который я пишу (частично учебное упражнение, частично потому, что я хочу вернуть что-то в открытый исходный код), и я подумал, что самый аккуратный способ определения местоположения хранилища будет использовать пользовательские атрибуты, так как я все равно буду использовать datacontractserializer.

Моя единственная проблема в настоящее время - это определение местоположения подчиненного типа, местоположение которого будет определяться идентификатором их родителя. например, сообщение <Блог. </p>

Мой путь к хранилищу будет примерно таким ...

сообщений \ blogid \ postid.xml

Где идентификатор блога будет определен путем анализа URL и возврата связанного блога. Это позволило бы мне размещать несколько блогов в одной установке, сохраняя при этом отдельные файлы хранилища сообщений, чтобы уменьшить накладные расходы памяти при загрузке сообщений.

Это прямое отрицание или есть лучший способ для меня сделать то, что я пытаюсь?

Edit:

После ответа Джона я попробовал это ...

 private static string GetSubordinatePath(Type type)
    {
        if (typeof(ISubordinate).IsAssignableFrom(type))
        {
            object instance = Activator.CreateInstance(type);
            return (instance as ISubordinate).ParentGuid.ToString();
        }
        else
        {
            // TODO: Localize this.
            throw new ArgumentException(
            String.Format(
            CultureInfo.CurrentCulture,
            "The specified type '{0}' does not impliment the ISubordinate interface. Please edit the source appropriately to enable storage.",
            type.GetType().Name));
        }
    }

Который будет вызываться из класса, читающего пользовательский атрибут.

Это хорошо работает ..

1 Ответ

2 голосов
/ 07 октября 2010

Это просто нет для атрибутов ... значения - это константы, вставленные в метаданные.

Один вариант, который вы могли бы использовать, заключался бы в том, чтобы встроить какой-либо шаблон в любое использованиеатрибуты ... так что вы можете иметь место хранения posts\{GetBlogId()} и вызывать метод во время выполнения.Это не совсем элегантно, хотя ... вы можете рассмотреть возможность использования интерфейса.

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