动态设置动态对象的属性

时间:2019-05-03 07:18:00

标签: c# reflection ssis

我有一个动态对象,该对象基本上包含一个AvroRecord。 AvroRecord类的详细信息here

我可以为属性静态分配值,但是我想知道是否可以动态完成。我看了论坛问题herehere以及here。但是这些都不适合我。

这是有效的静态代码。

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

该行是SSIS InputBuffer类的一个对象,它包含所有来自上游数据源的列。

上面使用的架构变量是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

如果您看到我的原始静态代码,则我正在尝试动态生成分配。我已经动态生成了架构(而不是上面给出的静态定义)。因此,剩下的唯一可以动态生成的就是分配的分配。一个想法可能是我生成了字符串,但是如何执行该字符串呢?只有在没有办法做到这一点的情况下。

1 个答案:

答案 0 :(得分:0)

如果我理解正确你的问题,我想你可以尝试这样的事情

        string _schema = "your avro schema"
        RecordSchema _record = (RecordSchema)Avro.Schema.Parse(_schema);
        GenericRecord _generic_record = new GenericRecord(payload_record);
        for (int ii = 0; ii < _record.Fields.Count; ii++)
        {
            _generic_record.Add(_record.Fields[ii].Name, Raw.TheFiledYouNeed);
        }