Добавление свойств на основе лямбда-выражений - PullRequest
0 голосов
/ 13 февраля 2012

Я использую C # для создания модели представления, которую позже сериализую в Json для использования с KnockoutJs.

Теперь мне нужно добавить информацию на уровне свойств, если определенный пользователь имеет доступ к просмотру и / илиотредактируйте свойство.

Поскольку у Javascript практически нет возможностей для отражения, я хочу сделать это с C # перед сериализацией в Json.

Моя модель представления может выглядеть следующим образом:

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.

* 1020.* Получившийся viewModel будет выглядеть так:
class ViewModel {
    public string Name { get; set; }
    public object CanRead { // Could non anonymous as well.
        return new {
            Name = true;
        };
    }
}

Можно ли это сделать с помощью динамики или мне нужно использовать Reflection.Emit?Я не прошу "покажи мне код".Я просто хочу знать, ментальна ли моя идея или возможно ли это.

Есть идеи?

1 Ответ

1 голос
/ 13 февраля 2012

Я думаю, что это было бы возможно, и вы могли бы использовать Lambdanator до помочь достичь этого.

Пример использования:

Lambda.Reflect<SomeClass>(x => x.AMethod());    
Lambda.Reflect<SomeClass>(x => x.AProperty);    
Lambda.Reflect(() => local);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...