Обходной путь для ограничения универсального атрибута C # - PullRequest
14 голосов
/ 20 марта 2012

Как обсуждено здесь , C # не поддерживает объявление универсального атрибута. Поэтому я не могу делать что-то вроде:

[Audit<User> (UserAction.Update)]
public ActionResult SomeMethod(int id){ ...

, который подходит как шарм в моем классе impl атрибута, потому что мне нужно вызвать метод из общего репозитория:

User fuuObj = (User) repository.LoadById<T>(_id);

Я пытался использовать это решение, но безуспешно. Я могу передать что-то вроде typeOf(User), но как я могу вызвать LoadById только с типом или магической строкой?

* И T, и Пользователь расширяют базовый класс, называемый Entity.

Ответы [ 3 ]

17 голосов
/ 20 марта 2012

Вы можете использовать отражение для загрузки по id:

public class AuditAttribute : Attribute
{
    public AuditAttribute(Type t)
    {
        this.Type = t;
    }

    public  Type Type { get; set; }

    public void DoSomething()
    {
        //type is not Entity
        if (!typeof(Entity).IsAssignableFrom(Type))
            throw new Exception();

        int _id;

        IRepository myRepository = new Repository();
        MethodInfo loadByIdMethod =  myRepository.GetType().GetMethod("LoadById");
        MethodInfo methodWithTypeArgument = loadByIdMethod.MakeGenericMethod(this.Type);
        Entity myEntity = (Entity)methodWithTypeArgument.Invoke(myRepository, new object[] { _id });
    }
}
4 голосов
/ 20 марта 2012

У вас есть по крайней мере эти три возможности:

  1. Вы можете использовать отражение, чтобы позвонить LoadById
  2. Вы можете создать дерево выражений, которое вызывает LoadById
  3. Вы можете предоставить LoadById метод в вашем хранилище, который не является универсальным.
1 голос
/ 20 марта 2012

Вы можете использовать отражение, чтобы вызвать метод LoadById. Следующая статья MSDN должна указывать вам в правильном направлении:

http://msdn.microsoft.com/en-us/library/b8ytshk6(v=vs.100).aspx

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