通过方法传入类型时如何使用'is'?

How to use 'is' when type passed in through method?

我正在尝试将一个类型传递给一个方法,在该方法中我可以检查它是否 'is' 某种类型。但是我下面的代码无法编译,我想知道出了什么问题。编译错误是:找不到类型或命名空间名称'dataType'。

public static List<object> findType(Type dataType)
{
    List<object> items = new List<object>();
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs)
    {
        if (entry.Value != null && entry.Value is dataType)
        {
            items.Add(entry.Value);
        }
    }
    return items;
}

我猜你想检查 entry.Value 的类型。

试试这个:

if (entry.Value != null && dataType.GetType().IsAssignableFrom(entry.Value))

它期望 dataType 本身是一个类型,而它是 Type 类型的变量。

is 运算符需要一个类型名称,而不是 Type instance.So 该类型应该在编译时已知。

但是您可以使用 IsAssignableFrom 方法来检查类型是否兼容:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType())

is 是 c# 中的一个特殊编译结构 - 你不能将变量作为类型,你必须写一个实际的类型名称。

如果你想检查 精确 类型使用这个:

if(entry.Value.GetType() == dataType)

如果你想检查它是否被继承,你可以使用这个:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType()))

entry.Value是一个对象,每个对象都有GetType()方法,return你是一个Type对象。 Type.Equal 可以比较那些类型。您可以在不使用 "is" 字的情况下做到这一点。

您不能使用 is 词,因为 "is" 想要接收对象而不是键入

以及显示如何使用 Type 实例的其他答案,您可以使您的方法通用。这将允许您使用 is,但显然取决于编译时固定的目标类型:

public static List<object> findType<TTarget>()
{
  List<object> items = new List<object>();
  foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs)
  {
    if (entry.Value != null && entry.Value is TTarget)
    {
       …

如果可以使用泛型和 LINQ,事情就会变得容易得多。假设 DataSource.ItemPairs 是一个字典类型。

public static List<T> findType<T>()
{
    List<T> items = new List<T>();
    foreach (T entry in DataSource.ItemPairs.Values.OfType<T>())
    {
        items.Add(entry);
    }
    return items;
}

甚至更短。

public static List<T> findType<T>()
{
    return DataSource.ItemPairs.Values.OfType<T>().ToList();
}