Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在泛型列表中获取T的类型_C#_Generics_Reflection_Types_Generic List - Fatal编程技术网

C# 如何在泛型列表中获取T的类型

C# 如何在泛型列表中获取T的类型,c#,generics,reflection,types,generic-list,C#,Generics,Reflection,Types,Generic List,我正在使用一个编辑器来反映我的类,并将它们转换为UI字段,以便通过更改UI中字段的值并保存它们来创建对象文件 问题是,当我使用通用列表时,编辑器生成器会停止,因为它不知道列表中要反映的对象的类型,它会一直将对象视为对象 我只需要知道列表或字典中对象的类型,以反映它 守则: class ListUIEditor<T> : BaseEditor where T : new() { void BuildEditor() { Button addbutton =

我正在使用一个编辑器来反映我的类,并将它们转换为UI字段,以便通过更改UI中字段的值并保存它们来创建对象文件

问题是,当我使用通用列表时,编辑器生成器会停止,因为它不知道列表中要反映的对象的类型,它会一直将对象视为
对象

我只需要知道列表或字典中对象的类型,以反映它

守则:

class ListUIEditor<T> : BaseEditor where T : new()
{
    void BuildEditor()
    {
       Button addbutton = new Button("+");
       addbutton.Clicked += add_Event;

        for (int i = 0; i < ((List<T>)base.boundObject).Count; i++)
        {
            container = new Container();         
            ObjectUIEditor editor = new ObjectUIEditor("itemName",
                                                       ((List<T>)base.boundObject)[i], 
                                                       container);
            editor.buildEditor();
            itemsSubEditors.Add(i, editor);
        }
    }

    protected void add_Event(object sender, EventArgs e)
    {       
        T newObject = new T();          
        container = new Container();            
        ObjectUIEditor editor = new ObjectUIEditor("itemName", newObject, container);
        editor.buildEditor();           
        itemsBox.ShowAll();
    }
}
class ListUIEditor:BaseEditor其中T:new()
{
void BuildEditor()
{
按钮addbutton=新按钮(“+”);
addbutton.Clicked+=添加_事件;
对于(int i=0;i<((List)base.boundObject).Count;i++)
{
容器=新容器();
ObjectUIEditor=new ObjectUIEditor(“itemName”,
((列表)base.boundObject)[i],
容器);
buildEditor();
添加(i,编辑器);
}
}
受保护的void add_事件(对象发送方、事件参数e)
{       
T newObject=newt();
容器=新容器();
ObjectUIEditor=new ObjectUIEditor(“itemName”、newObject、container);
buildEditor();
itemsBox.ShowAll();
}
}
试试这个:

Type type = listObj.GetType().GetGenericArguments()[0];

可能与我看到的问题重复,但不同的是,我不是在同一个类中询问T的类型:“您的列表具有与容器类本身相同的类型参数。”该问题还返回了类型:object not my desired classTry该问题的第二个答案(此处由YD1m回答的问题)。如果您仍然有问题,请发布实际代码。请添加您正在使用的代码,您的问题不清楚。我尝试了两种方法,但均无效:1:t listObj=new t()Type Type=listObj.GetType().GetGenericArguments()[0];这导致异常2:Type[]Type=boundObject.GetType().GetGenericArguments();此函数返回一个包含以下元素的数组:object@user2302005-如果您使用的泛型方法的泛型参数与泛型列表类型匹配,则只需使用
type itemType=typeof(T);
@user2302005“2:type[]type=boundObject.GetType().GetGenericArguments();此操作返回一个数组,其中一个元素为:object“--您正在处理<代码>列表<代码>?如果是这样,如果您只有该类型的信息,您无法确定它可以包含哪些类型的对象,您需要查看各个对象。@user2302005<代码>列表<代码>with
T=object
是<代码>列表…如果您的目标是拥有<代码>T其他类型,您需要使
T
成为其他类型,但您还没有显示任何相关代码来说明
T
是什么。@user2302005:告诉我们所有对象共享什么,它们有什么相似性。也许我们可以建议创建一个接口或公共基类。您对所有对象使用相同集合一定是有原因的。