C# 将泛型变量转换为特定类类型

C# 将泛型变量转换为特定类类型,c#,generics,casting,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<

这是我的密码

  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;

    }
public class MaterialRepository,其中T:Material,new()
{
公共列表ListMaterial{get;set;}
公共材料存储库(列表材料)
{
ListMaterial=新列表();
ListMaterial=ListMaterial;
}
公共T搜索材料(T输入材料)
{
T resultMaterial=新的T();
if(类型(T)=类型(弯曲材料))
{
//在这里做点什么
}
返回结果材料;
}
我的问题是如何将resultMaterial转换为材质的特定派生类(BendingMaterial)? 在//do somethine here..部分中,如果ListMaterials是通用的,如何使用BendingMaterial特定属性在ListMaterials中找到BendingMaterial?

试试看

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

List b=ListMaterial.OfType().ToList();

假设您有这样的类以及其他属性、方法和您拥有的:

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; }
}
然后,在方法中,您可以编写这样的代码,以获取材质对象列表中各个列表项的子类型,并访问它们的特定属性和方法。这应该适用于列表,即使您没有使用where T:Material约束,因为即使您将复选框或对象抛出到纯对象中在一般列表中,“if(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
List ListMaterial=新列表();
添加(新折弯材料());
添加(新的OtherMaterial());
foreach(列表材料中的材料m)
{
如果(m是弯曲材料)
{
字符串x=(m作为弯曲材料)。可弯曲性;
}
如果(m是其他材料)
{
布尔y=(m作为其他材料)。等温线;
}
}
//更多代码

这也是可能的,但我必须重新编码我的其他方法,是否有一种方法可以将resultMaterial转换为特定的方法?类似于T resultMaterial=new BendingMaterial()?好的,如果您的目的是将resultMaterial变量视为BendingMaterial,假设您已经完成了类型检查,并且您知道在尝试执行该转换时不会出现运行时错误,那么您可以执行BendingMaterial b=(runtimeMaterial作为BendingMaterial)Bug材料的属性和方法。结果:材质=新的Big材料()将编译,但在每种情况下都可能不做你要做的事情。它会让你远离泛型,但是你也可以考虑材料M =新的弯曲材料()。;因为你知道你有一个材料列表。设法修复了它,我将返回类型改为Material,而不是T,
Material m=new BendingMaterial();
成功了,谢谢你的帮助!
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