2013-11-11 2 views
0

Мне нужно создать свойства динамически.
Мой сценарий таков:
У меня есть много классов, которые происходят из BaseClass. BaseClass имеет словарь, в котором унаследованные классы должны определять материал. Эти определения выполняются следующим образом.Как создать свойства динамически?

public string Type 
{ 
    get 
    { 
     return dictionary["type"]; 
    } 
    set 
    { 
     dictionary["type"] = value; 
    } 
} 

Я много унаследованных методов, как это в моих производных классов, где имя свойства является почти идентичным ключом, который ссылается на соответствующее ему значение в словаре. Поэтому моя идея состоит в том, чтобы добавлять атрибуты в производные классы, начиная с подчеркивания, различать их и использовать их для создания этих свойств.

  1. Как бы я динамически определял эти свойства во время выполнения?
  2. Можно ли определить их во время компиляции? Имеет ли смысл это делать?
+2

, которые выглядят как свойство для меня, а не метод :) –

+0

Вы правы ... то, что потерпеть неудачу, исправляя ... – Erandros

+2

@ E.Vaughan Свойства это не что иное, как методы. :) – Leri

ответ

2

Если не хватает чего-то. Вы можете сделать что-то подобное с помощью ExpandoObject.

dynamic obj = new ExpandoObject(); 
obj.Type = "123";//Create Type property dynamically 
Console.WriteLine(obj.Type);//Access dynamically created Type property 
+1

Более интересный вопрос, возможно, в следующем: полезен ли разработчик для этого. Во многих случаях доступ индексатора, вероятно, более уместен. –

+0

@MarcGravell. Я не использовал это в производственном коде, не нужно этого до сих пор.Но я надеюсь, что это ответ на вопрос * Как бы я динамически определял эти свойства во время выполнения. * Как вы сказали, 'indexer' достаточно, хотя. –

+0

Не поймите меня неправильно - это лучший из ответов здесь (во время написания); во всяком случае, моя мысль направлена ​​на ОП. То, что у вас здесь * будет работать * –

0

Вы можете создавать функции динамически следующим образом,

Expression<Func<int, int, string>> exp = (x, y) => (x + y).ToString(); 
var func = exp.Compile(); 
Console.WriteLine(func.Invoke(2, 3)); 

Также вы можете поместить их в словарь и использовать их динамически.

Expression<Func<int, int, string>> expSum = (x, y) => (x + y).ToString(); 
Expression<Func<int, int, string>> expMul = (x, y) => (x*y).ToString(); 
Expression<Func<int, int, string>> expSub = (x, y) => (x - y).ToString(); 

Dictionary<string, Expression<Func<int, int, string>>> myExpressions = 
    new Dictionary<string, Expression<Func<int, int, string>>>(); 

myExpressions.Add("summation", expSum); 
myExpressions.Add("multiplication", expMul); 
myExpressions.Add("subtraction", expSub); 

foreach (var myExpression in myExpressions) 
{ 
    Console.WriteLine(myExpression.Value.Compile().Invoke(2, 3)); 
} 
0

Чтобы построить те, во время компиляции под капотом (не C# позади него), см PostSharp (это позволяет определить пользовательские шаблоны)

Но чтобы «создать» новые функции, вы можете быть интересно:

  • Expression.Compile для создания делегатов (динамические методы, которые мусор коллекционная в .net 4.5) Плюсы: что все-таки C#. Минусы: Это не позволяет создавать типы.

  • Reflection.Emit (в .Net framework) или Mono.Cecil (thirdparty), если вы хотите испускать динамические типы или методы во время выполнения. Используя это решение для вашего вопроса будет определять ваши свойства как абстрактные и динамически создавать тип (во время выполнения), который наследует от вас абстрактный класс, определенный в C#, реализует его автоматически. Плюсы: ОЧЕНЬ мощныйl. Минусы: Вы должны научиться IL :)

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