2015-02-13 2 views
0

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

public class Object1() 
{ 
    public unknownType1 Property1 { get; set; } 
    public unknownType2 Property2 { get; set; } 
} 

Тогда мы еще один объект под названием 'Object2', который выглядит примерно так ...

public class Object2() 
{ 
    public unknownType1 Property1 { get; set; } 
    public unknownType3 Property3 { get; set; } 
} 

I» хотел бы сопоставить эти объекты динамически во время выполнения, чтобы создать что-то вроде этого ...

public class Object3() 
{ 
    public unknownType1 Property1 { get; set; } 
    public unknownType2 Property2 { get; set; } 
    public unknownType3 Property3 { get; set; } 
} 

Обратите внимание, что оба объекта один и то же property1. Я уже изучал ExpandoObject, однако, поскольку я понятия не имею, какой тип объектов или свойств будет во время компиляции, я не думал, что это будет работать, поскольку Exapando вводит типы. Кто-нибудь имеет предложение о том, как подойти к этому?

+1

Итак, что бы вы сделали, если у обоих объектов был «Свойство1», типы которого не были равны? Это ошибка, или же 'Property1' сам является' dynamic' или 'object'? Как насчет методов на объектах? Вы можете извлечь из «DynamicObject» и реализовать свою собственную логику, но мне кажется, что вам будет намного проще использовать старомодный «Словарь <строка, объект>», видя, что все так динамично. –

+0

Подумайте об этом как о полном внешнем соединении между object1 и object2, чтобы создать список объектов3, где есть соответствующие свойства1. Эти неизвестные типы объектов будут содержать только данные, аналогичные объектам или объектам данных. Для целей этого примера меня интересуют только свойства. Другие методы или значения будут проигнорированы. Эти объекты и типы свойств будут загружаться через ссылки на сборки, а затем экземпляры создаются динамически. Отвечает ли это на ваш вопрос? – Thundter

+1

Под «соответствием' Property1's », вы имеете в виду, что вы точно знаете, что' Object1' и 'Object2' используют один и тот же тип для своих' Property1's? В SQL-выражении 'OUTER JOIN' будет генерировать * два *' Property1' столбца, по одному для каждого объекта, и вам придется их псевдоним, если вы хотите получить к ним доступ - если вы буквально не означаете что-то вроде WHERE Object1 .Property1 = Object2.Property1'. –

ответ

0

Вы можете попробовать Dictionary<string, object> где «Ключ» - это имя свойства («Свойство1», «Свойство2», ...) и «Значение» - это значение свойства.

0

Прежде всего, необходимо собрать свойства и значения ваших любых объектов somethong так:

object[] objectsCollection = new object[] { new StringBuilder(), new ASCIIEncoding() }; 
     foreach(var o in objectsCollection) 
     { 
      foreach(PropertyInfo pi in o.GetType().GetProperties()) 
      { 
       string propertyName = ((MemberInfo)pi).Name; 
       var propVal = pi.GetValue(o); 
       //here you can collect properties and values 
      } 
     } 

После того, как вы могли бы собрать свои имена свойств и значения, которые вы можете сохранить его в какой-то коллекции, как словарь, например

0

Ближайший я до сих пор анонимные типы. если вы сделаете что-то вроде этого ...

var Object1s = new List<Object1>() { Object1 }; 
var Object2s = new List<Object2>() { Object2 }; 

var object3s = Object1s 
    .Join(Object2s, o1 => o1.Property1, o2 => o2.Property1, 
     (o1, o2) => new 
     { 
      Property1 = o1.Property1, 
      Property2 = o1.Property2, 
      Property3 = o2.Property3 
     } 
    ).First(); 

... он производит анонимный тип, который имеет все три свойства. Хотя вывод этого может быть назначен только объекту, если может быть предоставлен тип с необходимыми свойствами, новый оператор может быть изменен для учетной записи для этого типа.

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

  (o1, o2) => new { o1, o2 } 

... который обеспечит все свойства дублируется независимо и object3 следует называть так ...

object3.o1.Property1, 
object3.o1.Property2, 
object3.o2.Property3 ... 

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

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