c# - 如何区分 IEnumerable<int> 和 IEnumerable<MyClass>?

标签 c# .net generics

我有一个带有 IEnumerable<T> 的方法参数。
T可以是 built-in .NET types 之一喜欢intstring或像这样的自定义类:

class MyClass
{
    public string Foo{ get; set; }
    public int Bar{ get; set; }
}

如果 T,我如何以编程方式识别是内置类型之一吗?

我知道我可以做这样的事情:

switch (typeof(T).Name.ToLower())
{
    case "int":          
    case "string":
    case "...":   // and so on...
        Console.WriteLine("It's a built-in type!");
        break;
    default:
        Console.WriteLine("It's a custom class!");
        break;
}

...但必须有更短/更简单的方法,对吧?


编辑:

好的,非常感谢你们到目前为止的回答。
但我仍然不确定哪一个最适合我的情况。

我真正想做的是:
我正在编写一个库来转换 IEnumerable<T>s进入ADODB.Recordsets .
在每次转换开始时,我需要创建一个空的 Recordset 并向其中添加字段。

如果T是自定义类,我得loop through its properties并在 Recordset 中为 T 的每个属性创建一个字段(带有属性的名称和类型)。

但是只有在 T 时循环遍历属性才能正常工作是自定义类。
例如,它 Tstring , 我得到了 string 的属性( CharsLength ),在这种情况下对我没有用。

这意味着仅仅检查它是否是原始类型是不够的——我需要识别像 DateTime 这样的东西和 GUID还有,而且可能还有更多。
(我必须承认,我没有注意到 DateTime 不在内置类型列表中)。

所以我想我真正想要的是:
告诉如果 T具有我可以循环或不循环的用户定义属性。
(无论它是否完全没有属性,如 int ,或者我不关心的属性,如 string 有)
这有意义吗?

但是,我仍然不确定该选择哪个答案。
driis 和 Jon Skeet 的回答都意味着我基本上必须列出很多类型(Jon 的回答比 driis 的回答更多)。
目前,我倾向于选择 Ron Sijm 的答案(尽管人们显然更喜欢其他答案),因为我猜只是检查 "System."。是做我想做的事情的最短方法,即使它看起来并不那么优雅......

最佳答案

这取决于您将什么定义为“内置类型”。在许多情况下,您可以查看类型是原始类型还是字符串。 (因为字符串被认为是“内置的”,但它不是原语)。

if (typeof(T).IsPrimitive || typeof(T) == typeof(string))
    Console.WriteLine("It's a built-in type");

如果您对这些原语 ( from MSDN ) 感到满意,则此方法有效:

The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.

请记住,类型名 int 只是 Int32 的 C# 别名。

编辑

为了确定可以直接用作记录集中的字段的类型,我可能会首先查看 IsPrimitive,然后使用 ADO 直接支持的其他“单值类型”的 HashSet。对要包含的类型进行头脑 Storm 后,出现了 GuidDecimalstringDateTime。我不认为还有太多其他人,但我可能是错的。

当然,直接驻留在 System 命名空间中的类型是一种简单的方法,但是当有人第一次向您传递 System.AppDomainSystem.Uri 时,您会遇到麻烦。基本上,如果您查看 System 命名空间中的内容,就会发现绝大多数类型都不应该放在单个字段中。

关于c# - 如何区分 IEnumerable<int> 和 IEnumerable<MyClass>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8029023/

相关文章:

C# 程序崩溃 comboBox SelectedItem ToString

c# - UseWindowsAzureActiveDirectoryBearerAuthentication 与 UseOpenIdConnectAuthentication 之间有什么区别?

.net - 从 .NET DLL 使用 webservice - app.config 问题

c# - 是否可以在 WPF 的单独进程中隔离某些控件?

c# - 是否可以在 C# 中将 GenericClass<SubClass> 添加到 List<GenericClass<Base>>?

抽象泛型函数的 typescript 模式似乎被打破了

delphi - 在类正在实现的泛型接口(interface)中使用在泛型类中声明的嵌套类型

c# - 使用itextsharp突出显示pdf中的单词,而不在浏览器中显示突出显示的单词

c# - 如何对派生自 List<T> 的对象进行深度复制

c# - .NET 正则表达式整个字符串匹配