如何在C#中返回具有与数组中该项相同类型的对象?

3
我将为您翻译该段内容:

我正在创建一个受 Ruby sample 方法启发的示例方法,它会从数组中返回一个随机对象,且保持在界限内。

我的方法运行良好,可以像这样调用:

questions.Sample<Question>();

这个函数的源代码目前看起来像这样:

public static class ArrayUtils
{
    public static T Sample<T>(this IList list)
    {
        var type = list[0].GetType();
        return (T) list[UnityEngine.Random.Range(0, list.Count)];
    }
}

问题是,我希望返回的类型只是数组中对象的类型,而不是包含我想要返回的类型。

例如,如果我们有一个Question[]类型的数组,它应该返回一个Question类型的对象。

基本上,在代码中,我想改变这个:

questions.Sample<Question>();

到这个:
questions.Sample();

感谢您的帮助,
Bilal

3
你期望那个方法调用的编译时类型是什么? - Jon Skeet
如果您不关心返回类型,那么可以完全放弃通用参数。否则,您可以使用通用的 List<T>,这样就不必指定它了。 - Igor
公共静态类 ArrayUtils { public static IList[] Sample(this IList list) { var type = list[0].GetType(); return (IList[])list[1]; } } - Vivek Nuna
如果您在设计时不知道方法的返回类型(除了object),那么您如何在方法中(不使用泛型)指定返回类型? - rory.ap
我担心这可能是一个静态语言的问题。只是想确认是否有人有我没有的直觉。 - Bilal Itani
1个回答

4

你只有三个选择。

第一种选择 - 如果你真的不关心返回类型,那么你可以选择这种方法。结果将始终以object形式返回。

public static object Sample(this IList list)
{
    return list[UnityEngine.Random.Range(0, list.Count)];
}

如果您在列表中使用值类型,则返回结果为对象时会发生装箱。感谢@rory.ap指出这一点。

选项2 - 如果您正在使用通用的IList<T>,则可以执行此操作,在这种情况下,将从正在使用的参数复制通用规范化程序。

public static T Sample<T>(this IList<T> list)
{
    return list[UnityEngine.Random.Range(0, list.Count)];
}

选项3-这是您已经拥有的,您必须指定通用类型。

public static T Sample<T>(this IList list)
{
    return (T)list[UnityEngine.Random.Range(0, list.Count)];
}

1
请注意,选项1中将发生装箱。 - rory.ap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接