4

SomeType[] に変換したい List 型のコレクションがあります。SomeType は実行前には不明です。

これは、次の手順の署名を使用して行う必要があります。

private object ConvertListToArray(IList  collection)
{
       // This does not work since SomeType is not known before runtime.
       var convertedList = collection.Cast<SomeType>().ToArray();
        return convertedList;
}

コレクションは IList ですが、具象型は

     List<SomeType>

返されるコレクションは、タイプ SomeType[] のオブジェクトでなければなりません。

これはどのように行うことができますか?

4

4 に答える 4

1

以下の実装でこれを行うことができます。

class Program
{
    static void Main(string[] args)
    {
        // same type
        var myCollection = new List<string> {"Hello", "World"};
        var array = (string[])myCollection.ConvertToArray();
        Console.WriteLine(array[0]);

        // new type
        var intList = new List<int> {1, 2, 3};
        var stringArray = (string[])intList.ConvertToArray(typeof(string));
        Console.WriteLine(stringArray[0]);

        // mixed types
        var ouch = new List<object> {1, "Mamma", 3.0};
        var result= (string[])ouch.ConvertToArray(typeof(string));
        Console.WriteLine(result[0]);


    }
}

実装:

public static class ListExtensions
{
    public static object ConvertToArray(this IList collection)
    {
        // guess type
        Type type;
        if (collection.GetType().IsGenericType && collection.GetType().GetGenericArguments().Length == 0)
            type = collection.GetType().GetGenericArguments()[0];
        else if (collection.Count > 0)
            type = collection[0].GetType();
        else
            throw new NotSupportedException("Failed to identify collection type for: " + collection.GetType());

        var array = (object[])Array.CreateInstance(type, collection.Count);
        for (int i = 0; i < array.Length; ++i)
            array[i] = collection[i];
        return array;
    }

    public static object ConvertToArray(this IList collection, Type arrayType)
    {
        var array = (object[])Array.CreateInstance(arrayType, collection.Count);
        for (int i = 0; i < array.Length; ++i)
        {
            var obj = collection[i];

            // if it's not castable, try to convert it
            if (!arrayType.IsInstanceOfType(obj))
                obj = Convert.ChangeType(obj, arrayType);

            array[i] = obj;
        }

        return array;
    }
}
于 2012-09-07T07:32:45.900 に答える
1
public static class ListExtensions
{
    public static T[] ConvertToArray<T>(IList list)
    {
        return list.Cast<T>().ToArray();
    }

    public static object[] ConvertToArrayRuntime(IList list, Type elementType)
    {
        var convertMethod = typeof(ListExtensions).GetMethod("ConvertToArray", BindingFlags.Static | BindingFlags.Public, null, new [] { typeof(IList)}, null);
        var genericMethod = convertMethod.MakeGenericMethod(elementType);
        return (object[])genericMethod.Invoke(null, new object[] {list});
    }

}
[TestFixture]
public class ExtensionTest
{
    [Test]
    public void TestThing()
    {
        IList list = new List<string>();
        list.Add("hello");
        list.Add("world");

        var myArray = ListExtensions.ConvertToArrayRuntime(list, typeof (string));
        Assert.IsTrue(myArray is string[]);
    }
}
于 2012-09-07T07:47:51.203 に答える
0

他の回答は少し冗長に見えるので、これを投稿しています。これは、OPが探していることを行うと確信しています。それは私のために働いた。

public static Array ConvertToArray(ICollection collection, Type type)
{ 
    var array = Array.CreateInstance(type, collection.Count);

    collection.CopyTo(array, 0);

    return array;
}
于 2016-06-28T15:42:40.567 に答える
0

あなたは試すことができます:

   private T[] ConvertListToArray<T>(IList collection)
   {
   // This does not work since SomeType is not known before runtime.
            var convertedList = collection.Cast<T>().ToArray();
            return convertedList;
        }
于 2012-09-07T07:43:21.180 に答える