解决方法为C#通用属性限制 [英] Workaround for C# generic attribute limitation

查看:116
本文介绍了解决方法为C#通用属性限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

随着讨论的这里,C#不支持通用属性声明。
所以,我不能做这样的事情:

As discussed here, C# doesn't support generic attribute declaration. So, I'm not allowed to do something like:

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



这将适合喜欢在我的属性实现类魅力,因为我需要调用从一个普通的仓库里的方法:

that would fit like a charm in my attribute impl class, cause I need to call a method from a generic repository:

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



我试图用的无功而返这个解决方案。我可以通过类似 typeof运算(用户),但我怎么能叫 LoadById 只是类型或特殊的字符串?

I tried to use this solution without success. I can pass something like typeOf(User), but how can I call LoadById just with type or magic string?

*双方,T和用户,被称为扩展实体的基类。

*Both, T and User, extend a base class called Entity.

推荐答案

您可以使用反射由ID可加载:

You could use reflection to load by 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 });
    }
}

这篇关于解决方法为C#通用属性限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆