如何从C#中使用与该项相同类型的数组返回对象?

时间:2016-10-25 20:18:23

标签: c# arrays list

我正在创建一个受ruby的示例方法启发的示例方法,该方法从数组中返回一个随机对象。

我的方法运行正常,我可以这样称呼它:

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();

感谢您的帮助,

比拉尔

1 个答案:

答案 0 :(得分:4)

你真的只有3个选择。

选项1 - 如果您真的不关心返回的类型,则可以执行此操作。结果将始终返回为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)];
}