C# 如何将泛型类型T强制转换为特定类型的列表

C# 如何将泛型类型T强制转换为特定类型的列表,c#,generics,casting,generic-list,C#,Generics,Casting,Generic List,我有一个将泛型类型T作为参数的方法。如果T是List类型,我想将其转换为一个列表,其中Y是T中包含的元素的类型。我怀疑我误解了泛型类型的约束,但希望您能提供帮助 例如: public void MapData<T>(T genericData) { var genericDataType = genericData.GetType(); if (genericDataType.Name.Contains("List")) { //Cast T to a

我有一个将泛型类型T作为参数的方法。如果T是List类型,我想将其转换为一个列表,其中Y是T中包含的元素的类型。我怀疑我误解了泛型类型的约束,但希望您能提供帮助

例如:

public void MapData<T>(T genericData)
{
   var genericDataType = genericData.GetType();

   if (genericDataType.Name.Contains("List"))
   {
      //Cast T to a List containing the type of elements contained in T
   }
 }
public void映射数据(T genericData)
{
var genericDataType=genericData.GetType();
if(genericDataType.Name.Contains(“列表”))
{
//将T强制转换为包含T中包含的元素类型的列表
}
}
我需要将genericData强制转换为列表,以便将其传递给另一个具有签名的方法:

public void MapListToField<T>(List<T> genericList) 
public void映射列表字段(列表常规列表)
更新

根据Eric下面的回答,我想分享我的一次尝试,也许有人可以指出我的错误。编译器声明我试图使用变量作为类型,我理解其含义,但elementType是一种类型,因此我不清楚如何修复:

var elementType = genericData.GetType().GetGenericArguments()[0];
var castedList = genericData as List<elementType>;
var elementType=genericData.GetType().GetGenericArguments()[0];
var castedList=作为列表的一般数据;

编辑:这与您的要求接近吗

代码:

void Main()
{
List stringlist=新列表{“a”、“b”、“c”};
List intlist=新列表{1,2,3};
字符串notList=“”;
var expression=expression.Call(typeof(Methods),“CastToList”,新类型[]{stringlist.GetType(),stringlist.GetType().GetGenericArguments()[0]},expression.Constant(stringlist));
Expression.Lambda(Expression.Compile());
expression=expression.Call(typeof(Methods),“CastToList”,新类型[]{intlist.GetType(),intlist.GetType().GetGenericArguments()[0]},expression.Constant(intlist));
Expression.Lambda(Expression.Compile());
expression=expression.Call(typeof(Methods),“CastToList”,新类型[]{notList.GetType(),typeof(object)},expression.Constant(notList));
Expression.Lambda(Expression.Compile());
}
公共静态类方法
{
公共静态无效映射列表字段(列表常规列表)
{
foreach(genericslist中的var元素)
{
Write(“{0},”,element.ToString());
}
控制台。写入(“\n”);
}
公共静态布尔卡斯托列表(L obj)
{
if(obj.GetType()==typeof(列表))
{
Write(“列表包含类型为:{0}\n”、类型为(T).ToString()的对象);
List genericList=obj as List;
MapListToField(通用列表);
返回true;
}
其他的
{
Write(“不是列表,类型是:{0}\n”,typeof(L.ToString());
返回false;
}
}
}
结果:

List contains objects of Type: System.String
a, b, c, 
List contains objects of Type: System.Int32
1, 2, 3, 
Not list, Type is: System.String
如果没有一个好的、更详细的场景描述,就不可能确切地知道这里的最佳方法是什么。也就是说

如果您要做的第一件事是检查对象是否是列表,然后将其传递给另一个将对列表进行操作的方法,为什么不为您的方法创建两个重载呢?例如:

public void MapData<T>(T genericData)
{
    // do stuff with non-list data
}

public void MapData<T>(List<T> genericList)
{
    MapListToField(genericList);
}
public void映射数据(T genericData)
{
//处理非列表数据
}
公共void映射数据(列表genericList)
{
MapListToField(通用列表);
}
如果要为这两种类型执行代码,请将其移动到
MapData()
的两个重载都可以调用的helper方法


无论您如何处理,您当前检查
列表
类型的机制都太脆弱,而且存在无法弥补的缺陷。有关更好的方法,请参阅。

谢谢Eric。我试图这样做,但一旦有了元素类型,我就无法将其转换为该类型的列表。我试过这样的方法:var myCastedList=(List)genericData;它不喜欢我放在列表中的ElementType,抱怨它是我试图用作类型的变量。你可以使用表达式,它们对泛型类型有很大的灵活性。您可以使用Expression.Convert,一旦您确定了要强制转换为所需类型和执行的类型。我可以试着写一个详细的例子。你知道你希望得到的列表中对象的类型吗?