如何在 c# 方法中传递类型?

How do I pass type in c# methods?

提问人:Matěj Vondráček 提问时间:5/22/2022 最后编辑:Matěj Vondráček 更新时间:5/22/2022 访问量:53

问:

我想编写一个方法,用于在我的列表中搜索一个对象,该对象可以包含多个继承类型。

public class MyClass 
{
   public readonly List<parentType> objects = new List<parentType>();

   public parentType GetObject(Type type, string tag)
   {
       foreach (parentType _object in objects)
       {
           if (_object.GetType() == type)
           {
                if (tag == _object.tag)
                {
                    return _object;
                }
            }
        }
        return null;
    }
}

但是当我打电话给.GetObject(childType, “tag”) 我得到 CS0119:“childType”是一个类型,在给定的上下文中无效

我该怎么办?谢谢。

C# 方法 类型 传递

评论

0赞 Yong Shun 5/22/2022
.GetObject(typeof(childType), "tag")?
0赞 Serg 5/22/2022
您是否知道编译时的确切内容,或者您应该在运行时从某些数据中获取它?childType
0赞 Matěj Vondráček 5/22/2022
@YongShun谢谢,这解决了我的问题。正如你所看到的,我仍然是c#的新手,很抱歉打扰你!

答:

0赞 Serg 5/22/2022 #1

这里有几种可能性:

  • typeof - GetObject(typeof(childType), "tag")

  • 以泛型方式重写函数,并使用类型作为泛型参数

    public parentType GetObject<T>(string tag) where T: parentType
    {
      //use T as the type to search
    }
    

    然后调用它GetObject<childType>("tag");

    在某些情况下,使用泛型参数返回更具体的类型也可能很有用

    T GetObject<T>(string tag) where T: parentType
    {
    }
    

    此外(但有点题外话)您可以使用 LINQ 来获得更简单和惯用的解决方案

    public T GetObject<T>(string tag) where T: parentType
    {
      return objects.OfType<T>().FirstOrDefault(obj => obj.tag == tag);
    }
    

评论

0赞 Matěj Vondráček 5/22/2022
谢谢,这真的帮助了:)。当 linq 选项在列表中找不到对象时,它是否仍返回 null?
0赞 Serg 5/22/2022
是的,确实如此。如果未找到任何内容或集合为空,则 LINQ 将返回。在您的情况下(因为 是类或其他引用类型),它将在未找到任何内容时返回,因为引用类型的默认值是 。FirstOrDefaultdefault(T)parentTypenullnull