簡體   English   中英

在C#中在運行時分配屬性類型

[英]assigning property type at runtime in C#

我有一個其中childNodeValue可以是字符串或List<ChildAttribute>類的同一個類,如果不支持相同的類,則另一個具有相同屬性的類,在遍歷時,我需要將所需的類型分配給childNodeValue

public class ChildAttribute
{
    public int? sequence { get; set; }
    public  Type<T> childNodeValue { get; set; } // string or List<ChildAttribute>
    public int? parentId { get; set; }

}

我的波紋管代碼中如何在運行時分配類型;

foreach (var pItem in pNodes)
{
    ParentAttribute pAtt = new ParentAttribute();
    pAtt.parentNodeValue = pItem["Attribute"].ToString();
    pAtt.id = Convert.ToInt32(pItem["ID"]);

    pAtt.ChildNodeValues = new List<ChildAttribute>();

    var cNodes = (from cRow in dt.AsEnumerable()
                  where cRow.Field<decimal?>("Parent_Id") == pAtt.id
                  select cRow).ToList();


    foreach (var cItem in cNodes)
    {
        ChildAttribute cAtt = new ChildAttribute();
        // May be another foreach required here 
        cAtt.childNodeValue = cItem["Attribute"].ToString();
        cAtt.sequence = Convert.ToInt32(!cItem.IsNull("Sequence"));
        cAtt.parentId = Convert.ToInt32(!cItem.IsNull("Parent_Id"));

        pAtt.ChildNodeValues.Add(cAtt);
    }
    att.ParentNodes.Add(pAtt);
}  

在C#中,您有幾個選擇:

  1. 聲明您的財產作為對象
  2. 將您的媒體資源聲明為動態
  3. 使用兩個名稱不同的屬性,一個屬性為string類型,另一個屬性為List類型。
  4. 定義一個擁有兩個屬性的新類ChildrenOrValue 實現往返於stringList的隱式類型轉換。

選項1和2的缺點是,您每次嘗試訪問此屬性時都必須檢查實際的運行時類型,並在每次使用前將這些值轉換回適當的類型。 第四個選項是最復雜的,可能是一個過大的選擇。

第三種選擇最有意義:

public class ChildAttribute
{
    public int? sequence { get; set; }
    public List<ChildAttribute> children { get; set; }
    public string value { get; set; }
    public int? parentId { get; set; }
}

即使此選項強制您每次要使用那些屬性時都檢查哪個屬性可用,它並不需要您向下轉換為適當的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM