Динамически установить свойства динамического объекта - PullRequest
2 голосов
/ 03 мая 2019

У меня есть динамический объект, который в основном содержит AvroRecord. Сведения о классе AvroRecord здесь .

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

Это статический код, который работает.

    var serializer = AvroSerializer.CreateGeneric(Schema);
    var rootSchema = serializer.WriterSchema as RecordSchema;
    dynamic counterpartRow = new AvroRecord(rootSchema);
    counterpartRow.CounterpartID = Row.CounterpartID
    counterpartRow.CounterpartFirstDepositDate = Row.CounterpartFirstDepositDate

Row является объектом класса InputBuffer службы SSIS и содержит все столбцы, поступающие из вышестоящего источника данных.

Переменная схемы, использованная выше, представляет собой схему avro, которая выглядит примерно так:

 Schema = @"{
                                ""type"":""record"",
                                ""name"":""Microsoft.Hadoop.Avro.Specifications.Counterparts"",
                                ""fields"":
                                    [
                                       { ""name"":""CounterpartID"", ""type"":""int"" },
                                       { ""name"":""CounterpartFirstDepositDate"",  ""type"":[""string"",""null""] },
                                       { ""name"":""CounterpartFirstTradeDate"",""type"":[""string"",""null""] },
                                       { ""name"":""ClientSegmentReportingID"",""type"":""int"" },
                                       { ""name"":""ClientSegmentReportingName"", ""type"":[""string"",""null""] },
                                       { ""name"":""ContractID"", ""type"":""int""},
                                       { ""name"":""ContractFirstDepositDate"", ""type"":[""string"",""null""]},
                                       { ""name"":""ContractFirstTradeDate"",""type"":[""string"",""null""] },
                                       { ""name"":""ContractClosingOffice"",""type"":[""string"",""null""] },
                                       { ""name"":""LeadCreationDate"", ""type"":[""string"",""null""] },
                                       { ""name"":""ContractCountryOfResidence"", ""type"":[""string"",""null""]}
                                    ]
                            }";

Я пробовал что-то вроде предыдущих ссылок на форумах, вроде

counterpartRow.GetType().GetField("CounterpartID").SetValue(Row, Row.CounterpartID, null);

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

foreach (string propertyName in GetPropertyKeysForDynamic(counterpartRow.Schema.Fields()))
        {
            string propertyValue = counterpartRow[propertyName];


        }

и функция, определенная следующим образом.

 public List<string> GetPropertyKeysForDynamic(dynamic dynamicToGetPropertiesFor)
    {
        var jObject = (JObject)JToken.FromObject(dynamicToGetPropertiesFor);
        Dictionary<string, object> values = jObject.ToObject<Dictionary<string, object>>();
        List<string> toReturn = new List<string>();
        foreach (string key in values.Keys)
        {
            toReturn.Add(key);
        }
        return toReturn;
    }

Словарь выше возвращает пустое значение.

Указанная выше строка является объектом класса InputBuffer (автоматически сгенерированный класс в SSIS).

что-то вроде этого.

public class Input0Buffer: ScriptBuffer

{
    public Input0Buffer(PipelineBuffer Buffer, int[] BufferColumnIndexes, OutputNameMap OutputMap)
        : base(Buffer, BufferColumnIndexes, OutputMap)
    {
    }

    public Int32 CounterpartID
    {
        get
        {
            return Buffer.GetInt32(BufferColumnIndexes[0]);
        }
    }
------more properties

Если вы видите мой исходный статический код, я пытаюсь динамически сгенерировать назначение. Я уже динамически сгенерировал схему (вместо статического определения, которое я дал выше). Таким образом, единственное, что осталось генерировать динамически, - это назначение присваивания. Идея может заключаться в том, что я генерирую строку, но как мне затем выполнить эту строку? Это только в том случае, если нет способа достичь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...