C# 列表<;T>;定义为类的成员

C# 列表<;T>;定义为类的成员,c#,C#,我有一个列表,其中我希望类型由调用定义,例如在类中,我希望 public class ClassName { public ListType<T> ListName { get; set; } // other class items } ClassName.Create(new ListType<SomeType>(x, y, z)); 公共类类名 { 公共ListType ListName{get;set;} //其他类别项目 } 然后使用什么来

我有一个列表,其中我希望类型由调用定义,例如在类中,我希望

public class ClassName
{
    public ListType<T> ListName { get; set; }
    // other class items
}
ClassName.Create(new ListType<SomeType>(x, y, z));
公共类类名
{
公共ListType ListName{get;set;}
//其他类别项目
}
然后使用什么来设置类类型

var className = new ClassName()
{
    ListType<int> = data
};
var className=new className()
{
ListType=数据类型
};
所以基本上这就是我想要的,我让它使用dynamic工作,所以类是

public class ClassName
{
    public ListType<dynamic> ListName { get; set; }
    // other class items
}
公共类类名
{
公共ListType ListName{get;set;}
//其他类别项目
}
电话是

var className = new ClassName()
{
    ListType<dynamic> = data
};
var className=new className()
{
ListType=数据类型
};
这是可行的,但我想知道是否有更好的方法来做到这一点,所以我不必使用动态

哦,差点忘了提到列表类型是

public class ListType<T> : List<T>
{
}
公共类列表类型:列表
{
}
因此,通过向其传递不同的类型不会失败

谢谢

编辑: 意识到我在堆栈溢出上使用的代码与我的代码不同

ListType有一个接受3个参数的构造函数,因此使用更方便

var className = new ClassName()
{
    ListName = new ListType<Type>(x, y, z)
}
var className=new className()
{
ListName=新的ListType(x,y,z)
}
怎么样

public class ClassName<T>
{
    public ListType<T> ListName { get; set; }
    // other class items
}
公共类类名
{
公共ListType ListName{get;set;}
//其他类别项目
}
然后像这样使用它:

var className = new ClassName<int>()
{
    ListName = data;
};
var className=new className()
{
ListName=数据;
};

对Bertrand的答案稍加补充,可以让您在特定用例中不重复类型参数,甚至不提及它:

public static class ClassName
{
    public static ClassName<T> Create<T>(ListType<T> list)
    {
        return new ClassName<T> { ListName = list };
    }

    public static ClassName<T> Create<T>(params T[] list)
    {
        return new ClassName<T> { ListName = new ListType<T>(list) };
    }
}
让编译器计算出
T
SomeType
,但这并不总是有效的


请注意,
ClassName
ClassName
是不同的类,您可能希望对其进行不同的命名,例如,
ClassNameFactory

new ClassName(){ListType=data;}
”。这真的有效吗?我从来没有见过这样的语法。在我的代码中,是的,我没有使用ints,而它使用的是来自数据实体的模型,因此在我的实际代码中,它更新的类名(){ListType=(Db.GetAll())};它从模型类型中获取所有记录(在堆栈溢出中键入时也犯了错误,数据后不应是分号),该语法与{get;set;}一起使用。它允许您创建新对象并设置值,而无需构造函数,如果您对查找更多示例感兴趣,那么MVC+viewModels似乎经常使用它。我确实尝试过这一点,但是当我这样做时,我不得不指定两次类型,或者我遇到了编译器错误,因此用法更像var className=new className(){ListName=data};编辑了原始帖子,因此用法与我的实际程序模式匹配,因此更像var className=new className(){ListName=new ListItem(x,y,z)};虽然这种方法有效,但我还是不喜欢ModelName的重复
ClassName.Create(x, y, z);