将泛型变量转换为特定的类类型

本文关键字:类型 泛型 变量 转换 | 更新日期: 2023-09-27 18:21:37

这是我的代码

  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?

将泛型变量转换为特定的类类型

假设您有这样的类,它们具有其他属性、方法和其他内容:

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对象中单个列表项的子类型,并访问它们的特定属性和方法。即使你没有使用where T:Material约束,这也应该适用于列表T,因为即使你将复选框或对象放入纯泛型列表,"如果(m是弯曲材料"将匹配预期的材料对象并相应地处理它。

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

尝试

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

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