将通用变量转换为特定的类类型

时间:2014-09-11 02:57:20

标签: c# generics casting

这是我的代码

  public class MaterialRepository<T> where T : Material, new()
    {
        public List<T> ListMaterial { get; set; }

        public MaterialRepository(List<T> listMaterial)
        {
            ListMaterial = new List<T>();
            ListMaterial = listMaterial;
        }

   public T SearchMaterial(T inputMaterial)
    {
        T resultMaterial = new T();
        if (typeof(T) == typeof(BendingMaterial))
        {
           //do something here        
        }

        return resultMaterial;

    }

我的问题是如何将resultMaterial转换为Material的特定派生类(BendingMaterial)? 并且在 //在这里做点什么...... 部分,如果ListMaterials是通用的,如何使用BendingMaterial特定属性在ListMaterials中找到BendingMaterial?

2 个答案:

答案 0 :(得分:0)

尝试

BendingMaterial m = (BendingMaterial)(object)mrep.SearchMaterial(inpm);

List<BendingMaterial> b = ListMaterial.OfType<BendingMaterial>().ToList();

答案 1 :(得分:0)

假设你有类似这样的类,有其他属性,方法和你有什么:

public class Material
{
    public decimal Density { get; set; }
}

public class BendingMaterial : Material
{
    public string Bendability { get; set; }
}

public class OtherMaterial : Material
{
    public bool IsOther { get; set; }
}

然后在您的方法中,您可以编写这样的代码来获取List of Material对象中各个列表项的子类型,并访问它们的特定属性和方法。这应该适用于列表T,即使您没有使用where T:Material约束,因为即使您将Checkbox或对象放入纯粹的通用列表中,“if(m is BendingMaterial”将匹配预期的Material反对并处理它。

List<T> ListMaterial = new List<Material>();
ListMaterial .Add(new BendingMaterial());
ListMaterial .Add(new OtherMaterial());

foreach (Material m in ListMaterial )
{
   if (m is BendingMaterial)
   {
       string x = (m as BendingMaterial).Bendability;
   }
   if (m is OtherMaterial)
   {
       bool y = (m as OtherMaterial).IsOther;
   }
}
//more code