gpt4 book ai didi

c# - 在泛型类型定义中使用 'params' 的方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:41 25 4
gpt4 key购买 nike

This question让我思考如何编写一个需要包含类型参数变量列表的方法。

一种方法是接受 params Type[]作为参数的一部分,例如:

public static bool IsOneOf(this object obj, params Type[] types)
{
return types.Contains(obj.GetType());
}

但是,使用有点冗长(例如 obj.IsOneOf(typeof(int), typeof(bool), typeof(double)) ),我想知道是否有替代方法来定义一个采用任意数量的通用参数的方法。类似于:

public static bool IsOneOf<params TArgs[]>(this object obj)
{
// use TArgs here
}

一个解决方案是使用 4.0 BCL 的 Tuple 类(它定义了一个公共(public)接口(interface) ITuple 以及 Tuple<T1>Tuple<T1, T2> 等)来定义如下内容:

public static bool IsOneOf<TTypes>(this object obj) where TTypes : ITuple
{
Type tupleType = typeof(TTypes);
return tupleType.GetGenericArguments().Contains(obj.GetType());
}

然后可以这样使用:

if (obj.IsOneOf<Tuple<int, bool, decimal>>()) { ... }

这里是否有性能方面的考虑,或者是否有实现此语法的替代方法?

最佳答案

通过将循环展开为每个“arity”的特殊情况,您可以挤出一点额外的速度:

static bool IsOneOf<T1>(object o)
{
return (o.GetType() == typeof (T1));
}

static bool IsOneOf<T1, T2>(object o)
{
return (o.GetType() == typeof(T1)) ||
(o.GetType() == typeof(T2));
}

static bool IsOneOf<T1, T2, T3>(object o)
{
return (o.GetType() == typeof(T1)) ||
(o.GetType() == typeof(T2)) ||
(o.GetType() == typeof(T3));
}

等等。

但是,您多久需要知道一个对象是一对不相关类型中的一个还是另一个?更不用说三个或更多了。对我来说似乎是一个模糊的需求。

关于c# - 在泛型类型定义中使用 'params' 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com