【问题标题】:Check if the typeof(object) in a List is a reference type检查 List 中的 typeof(object) 是否为引用类型
【发布时间】:2010-10-08 21:36:41
【问题描述】:

这对我来说似乎很奇怪:

if(customerList.Count > 0)
{
   if(typeof(customerList[0]).IsReferenceType)
   {
      // do what I want
   }
}

你会怎么做?

【问题讨论】:

  • 你能把问题说清楚吗?你到底想做什么?
  • 看我的标题问题:)有一个问题...
  • 还是不太清楚。请编辑问题,使其包含阐明现有答案不足的关键信息。
  • 嗨,这对我来说似乎很奇怪:“你会怎么做?”这似乎不是一个能准确解释您要问什么的问题...

标签: c# list object typeof


【解决方案1】:
  1. 判断列表中的第一项是否为引用类型的对象:

    bool isReferenceType = !(customerList[0] is ValueType);
    
  2. 要确定一个列表是否是 List<T> 对于某些 T 的引用类型:

    var listType = customerList.GetType();
    if (!listType.IsGeneric || listType.GetGenericTypeDefinition() != typeof(List<>))
        // It’s not a List<T>
        return null;
    return !listType.GetGenericArguments()[0].IsValueType;
    

【讨论】:

  • 我得到的最多的异常是因为customerList是空的并且没有索引......:P
  • List 没有对象时如何检索 isReferenceType?但 List 表示它的类型为 T,例如 Customer。实际上我没有添加一个客户对象来找出我的列表需要客户类型的客户......
  • @Lisa:您可能正在寻找我的答案中的第二个解决方案。 (虽然还不是很清楚。你为什么不能直接说你有什么和你需要什么?)
【解决方案2】:

您可能正在尝试确定泛型集合的泛型参数的实际类型。就像在运行时确定特定 List&lt;T&gt; 的 T 是什么。这样做:

Type collectionType = typeof(customerList);
Type parameterType = collectionType.GetGenericArguments()[0];
bool isReference = !parameterType.IsValueType;

【讨论】:

  • 值得注意的是,List&lt;structImplementingIEnumerator&gt; 的行为与包含 structImplementingIEnumerator 实例的 List&lt;IEnumerator&gt; 不同。重要的是列表是封装项目还是对项目的引用。如果列表封装了对项目的引用,那么这些项目本身是否派生自ValueType 并不重要——除了Equals 的可能损坏的实现之外,它们几乎在所有方面都表现得像类对象。
【解决方案3】:
bool isReferenceType = !(customerList[0] is ValueType);

编辑

或者您是否正在寻找类似的东西:

bool listIsOfReferenceTypeObjects = !myList.GetType().GetGenericArguments()[0].IsValueType;

【讨论】:

  • 当 list.Count 为零时,我真的需要告诉不访问 List 的索引 0 吗?
【解决方案4】:

好的,当 customerList 为空时,我也没有例外。

Type collectionType = customerList.GetType();
   Type parameterType = collectionType.GetGenericArguments()[0];
   bool isReference = !parameterType.IsValueType;

@Adesit 你得到一个点,因为你的样本是正确的,除了第一行:P

【讨论】:

  • 这与我的回答中的第二点完全相同,除了我的不是泛型类型时不会崩溃。
  • @Timwi 嗯,您编辑了您的解决方案,也许我还没有阅读它。我只需要知道 List 的“T”是值类型(int)还是引用类型(自定义类)。在我这边没有崩溃。
  • 当然会崩溃!尝试传入不是泛型类型的 anything,例如string...
  • 我还没有检查你的建议,因为不知何故我觉得我们的意思不同......:我会举个例子。用户可以将 List(引用类型)插入我的 DataSource 或 List(值类型)。我想检查这些类型,因为如果他插入 List 我会抛出异常,因为只允许引用类型具有可以再次成为值类型的属性。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多