po_saa Ответов: 3

Как получить тип элемента в списке


Не могли бы вы предложить

У меня есть тип списка элементов типа "unknown"... скажем, тот самый Type = typeof(List<of_something>)

как определить, является ли это тип списка< gt; или массива
как определить тип включенных элементов - то есть для вызова typeof(of_something)

спасибо Вам вперед за совет

Что я уже пробовал:

Я понятия не имею, как это реализовать
Я застрял

3 Ответов

Рейтинг:
1

OriginalGriff

Да, вы можете это сделать.
Попробуйте эти методы расширения:

public static class Extensions
    {
    public static Type GetContainedType<T>(this List<T> ls)
        {
        return typeof(T);
        }
    public static Type GetContainedType(this Array ar)
        {
        return ar.GetType().GetElementType();
        }
    }
Затем вы можете вызвать их в своих коллекциях:
List<string> sl = new List<string>();
string[] sa = new string[10];
List<int> il = new List<int>();
int[] ia = new int[10];
Type tsl = sl.GetContainedType();
Type tsa = sa.GetContainedType();
Type til = il.GetContainedType();
Type tia = ia.GetContainedType();


po_saa

Привет! Спасибо Вам за ваш ответ!
Хотя, это не совсем то, что я имел в виду

Пожалуйста, смотрите мою версию ниже

Рейтинг:
1

po_saa

Привет!

Я предполагал что-то вроде этого:

class Program
{
    static void Main(string[] args)
    {
        Type t = (new List<MyType>() {new MyType(), new MyType(), new MyType() }).GetType();    //this is just for pupose of getting TYPE of List<string>
        //at this position we are interested in Type, not object itself

        //there is no object - just "Type" or PropertyInfo

        TypeInfo pi = t.GetTypeInfo();
        PropertyInfo prop = pi.DeclaredProperties.Where(c => c.Name == "Item").FirstOrDefault();
        Type tp = prop.PropertyType;
        object obj = tp.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
        //now I need to cast the obj to the appropriate type to call the method Name()
    }
}

class MyType
{
    public string Name()
    {
        return "It's me";
    }
}


теперь мне нужно привести obj к соответствующему типу, чтобы вызвать имя метода()


Nelek

Пожалуйста, используйте "улучшить вопрос", если вам нужно что-то добавить к этому вопросу. Размещение решений только затруднит вам помощь, потому что они не упорядочены в хронологическом порядке

Рейтинг:
0

po_saa

class Program
    {
        static void Main(string[] args)
        {
            Type t = (new List<MyType>() {new MyType("1"), new MyType("2"), new MyType("3") }).GetType();    //this is just for pupose of getting TYPE of List<string>
            //at this position we are interested in Type, not object itself
            //this is no object - just "Type" or PropertyInfo
            TypeInfo pi = t.GetTypeInfo();
            PropertyInfo prop = pi.DeclaredProperties.Where(c => c.Name == "Item").FirstOrDefault(); //no matter how much objects were built and included in List (again - there is no object - just TYPE)
            Type tp = prop.PropertyType;
            object obj = tp.InvokeMember("", BindingFlags.CreateInstance, null, null, new object[] { "from Invoke" });

            //now we need to cast the obj to the appropriate type to call the method Name()

            object name = tp.InvokeMember("Name", BindingFlags.InvokeMethod, null, obj, null);
            //on my opinion there is just one way to invoke inner method without casting an object "obj" to the type "tp"
            //but still it would be better to obtain an object "obj" of properly type.
        }
    }

    class MyType
    {
        public MyType()
        {
            Console.Write("I was born => my name is: ");
        }

        public MyType(string s) : this()
        {
            Console.WriteLine(s);
        }

        public string Name()
        {
            return "It's me " ;
        }
    }


на мой взгляд, есть только один способ вызвать внутренний метод без приведения объекта "obj" к типу "tp"
но все же было бы лучше получить объект "obj" соответствующего типа.


Nelek

Пожалуйста, используйте "улучшить вопрос", если вам нужно что-то добавить к этому вопросу. Размещение решений только затруднит вам помощь, потому что они не упорядочены в хронологическом порядке

po_saa

Я вижу кнопку "улучшить" на своих собственных реализациях
Не могли бы вы подсказать, как ответить участникам

Спасибо

Nelek

используя "есть вопрос или комментарий" или "ответить" на другой комментарий (как я сейчас делаю с этим сообщением)

po_saa

к сожалению, он не позволяет отправить код в ответ - только простой текст

Nelek

Вот почему я сказал вам обновить свой вопрос, вы можете написать "adition после комментария XXXX", а затем свой код

Таким образом, каждый читающий ваш вопрос увидит всю соответствующую информацию сразу, без необходимости читать все ответы и комментарии.

po_saa

Итак, вы предлагаете мне нажать кнопку "улучшить" в моем (!) вопросе (вверху) вместо ответа участнику?

Nelek

Если вы хотите добавить код или информацию, имеющую отношение к вопросу, и это может помочь другим людям понять, чего вы хотите... да. Он должен перейти к вопросу

Nelek

Вы сказали OriginalGriff в комментарии: "смотрите мою версию ниже", и вы опубликовали решение.
Что было бы так трудно сказать "смотрите мое дополнение выше" и отредактировать вопрос? "EDIT: добавление после решения 1- а то, что пишут все, чего ты хочешь?

Решения придумываются для того, чтобы люди могли ответить ты- не для того, чтобы завести разговор.

po_saa

видимо, вам стоит сказать мне, как это было бы правильно применимо к данному конкретному сайту.
Я прочитал ваши предложения и постараюсь им следовать