基于lambda表达式添加属性

时间:2012-02-13 16:45:10

标签: c# reflection dynamic

我正在使用C#创建一个视图模型,后来我将其序列化为Json以与KnockoutJs一起使用。

现在,如果某个用户有权查看和/或编辑该属性,我需要在属性级别添加信息。

由于Javascript几乎没有反射可能性,我想在序列化到Json之前用C#做这个。

我的视图模型可能如下所示:

class ViewModel {
    public string Name { get; set; }        
}

我想使用一个用户访问服务来接受具有一些角色的用户和视图模型并浏览角色并应用访问权限。像这样:

class AccessService {
    public void Apply(IUser user, ViewModel viewModel) {
        if(user.Roles.Contains(Roles.Admin)) {
            viewModel.AllowRead(vm => vm.Name);
        }
    }
}

viewModel.AllowRead(..)方法将是一个扩展方法,它会占用object(或者如果需要可能是一个接口或类型),这就是魔法发生的地方。

我希望此操作的结果是viewModel将获得一个名为CanRead的新属性,而该属性又具有名为Name的布尔属性。

结果viewModel看起来像这样:

class ViewModel {
    public string Name { get; set; }
    public object CanRead { // Could non anonymous as well.
        return new {
            Name = true;
        };
    }
}

这可以用动态完成,还是必须使用Reflection.Emit?我不是要求“告诉我代码”。我只是想知道我的想法是否是精神上的或者是否可能。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为这是可能的,您可以使用Lambdanator 帮助来实现这一目标。

使用示例:

Lambda.Reflect<SomeClass>(x => x.AMethod());    
Lambda.Reflect<SomeClass>(x => x.AProperty);    
Lambda.Reflect(() => local);