2012-02-13 2 views
0

Я использую 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.

В результате viewModel будет выглядеть следующим образом:

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

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

Любые идеи?

+0

Является ли это 'ViewModel', используемые в WPF? – user7116

+0

Нет, он используется с KnockoutJs, который является MVVM для Javascript, следовательно, JSON. –

ответ

1

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

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

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

Хотя это поможет мне получить существующие свойства из типа, основанного на выражении Lambda, это не помогает мне в Reflection.Emit, динамическом или любом другом, что необходимо для достижения моей цели. Еще интересно. Благодаря! –

+0

Да, это всего лишь первый шаг на прогулке. Я думаю, что то, о чем вы просите, возможно с Reflection & dynamic, но я не пробовал. –

+1

Я решил это сейчас. Оно прекрасно! Я использовал 'dynamic'' ExpandoObject' в классе ViewModelBase, который отображается как свойство. Затем я украл некоторую магию Expression от Lambdanator, в основном просто «Expression >» и создал метод расширения, который добавляет свойство динамическому объекту, используя '((IDictionary ) theDynamicProperty) [memberAccess.Member .Name] = true; '. Он работает очень хорошо! Спасибо за подсказку с Lambdanator. –

Смежные вопросы