Динамически создать массив типа в C # - PullRequest
8 голосов
/ 15 января 2011

В C # мне нужно иметь возможность создавать массив объектов Type во время выполнения на основе разделенного запятыми списка типов данных, передаваемых в функцию в виде строки. Вот что я пытаюсь сделать:

// create array of types
Type[] paramTypes = { typeof(uint), typeof(string), typeof(string), typeof(uint) };

Но мне нужно иметь возможность вызывать мою функцию следующим образом:

MyFunction("uint, string, string, uint");

и пусть он генерирует массив динамически на основе переданной строки. Вот моя первая попытка:

void MyFunction(string dataTypes)
{
    //out or in parameters of your function.   
    char[] charSeparators = new char[] {',', ' '};
    string[] types = dataTypes.Split(charSeparators,
                        stringSplitOptions.RemoveEmptyEntries);

    // create a list of data types for each argument
    List<Type> listTypes = new List<Type>();
    foreach (string t in types)
    {
        listTypes.Add(Type.GetType(t)); 
    }
    // convert the list to an array
    Type [] paramTypes = listTypes.ToArray<Type>();

}

Этот код просто создает массив нулевых объектов типа System.Type. Я уверен, что проблема заключается здесь:

listTypes.Add(Type.GetType(t));

Предложения о том, почему этот синтаксис не работает?

Ответы [ 4 ]

6 голосов
/ 15 января 2011

Передача System.String, System.Int32 вместо string и int.

"строка" - это просто сокращение для System.String.Type.GetType не принимает сокращенную запись для типов.

5 голосов
/ 15 января 2011

Проблема в том, что в .NET нет типов uint и string.Это псевдонимы типа C # для реальных типов System.UInt32 и System.String .Поэтому вы должны вызывать свою функцию так:

MyFunction("System.UInt32, System.String, System.String, System.UInt32");
4 голосов
/ 15 января 2011

Используйте полное имя для каждого типа, включая пространство имен. Вот так:

class Program
{
    static void Main(string[] args)
    {
        var dataTypes = "System.UInt32, System.String, System.String, System.UInt32";

        //out or in parameters of your function.   
        char[] charSeparators = new char[] { ',', ' ' };
        string[] types = dataTypes.Split(charSeparators,
                            StringSplitOptions.RemoveEmptyEntries);

        // create a list of data types for each argument
        List<Type> listTypes = new List<Type>();
        foreach (string t in types)
        {
            listTypes.Add(Type.GetType(t));
        }
        // convert the list to an array
        Type[] paramTypes = listTypes.ToArray<Type>();
    }
}
2 голосов
/ 15 января 2011

Не работает, потому что uint, string и т. Д. Не являются официальными именами типов .net.Это псевдонимы C # для System.UInt32, System.String и т. Д. Вам нужно будет использовать имена типов .net, если вы хотите создавать такие типы динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...