繁体   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