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