C# 在运行时定义的类型的列表
我正在使用C#作为编程语言执行自动化 我有一个枚举,在表中保存列。我将这些列的数据类型保存在每个列名称的“描述”中 每个列都是可排序的,排序后我想验证对特定列的排序是否正确。我在列中创建一个数据列表,以编程方式排序,然后在屏幕上排序,读取内容,然后使用list.SequenceEquals 我试图创建一个“类型”列表(如“描述”中所述)。但看起来我无法创建运行时对象列表 有什么解决办法吗 代码C# 在运行时定义的类型的列表,c#,C#,我正在使用C#作为编程语言执行自动化 我有一个枚举,在表中保存列。我将这些列的数据类型保存在每个列名称的“描述”中 每个列都是可排序的,排序后我想验证对特定列的排序是否正确。我在列中创建一个数据列表,以编程方式排序,然后在屏幕上排序,读取内容,然后使用list.SequenceEquals 我试图创建一个“类型”列表(如“描述”中所述)。但看起来我无法创建运行时对象列表 有什么解决办法吗 代码 { 公共枚举列 { [说明(“日期时间”)] 发票日期, [说明(“字符串”)] 顾客 [说明(“字符
{
公共枚举列
{
[说明(“日期时间”)]
发票日期,
[说明(“字符串”)]
顾客
[说明(“字符串”)]
发票ID,
[说明(“字符串”)]
责任类型描述,
[说明(“字符串”)]
交易状态说明,
[说明(“字符串”)]
TestTransaction,
[说明(“字符串”)]
交易日期,
[说明(“int”)]
事务ID,
[说明(“字符串”)]
源系统,
[说明(“字符串”)]
船舶地理代码,
[说明(“日期时间”)]
创作时间
}
var type=MyExtensions.GetDataType(tranColumns.InvoiceDate);//获取系统.type
列表=新列表();
}
公共静态字符串GetEnumDescription(System.Enum值)
{
FieldInfo fi=value.GetType().GetField(value.ToString());
DescriptionAttribute[]属性=
(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),false;
if(attributes!=null&&attributes.Length>0)
返回属性[0]。说明;
其他的
返回值.ToString();
}
公共静态类型GetDataType(System.Enum值)
{
开关(GetEnumDescription(value).ToLower())
{
案例“日期时间”:
返回类型(日期时间);
大小写“字符串”:
返回类型(字符串);
案例“int”:
返回类型(Int32);
违约:
日志(“未知数据类型”,LogType.ErrorEntry);
返回类型(对象);
}
}
无法以这种方式创建“类型”列表 Type listType=typeof(列表)。MakeGenericType(类型);
IList list=(IList)Activator.CreateInstance(listType);
您需要将IList.Add与对象一起使用,因为无法转换为列表。我重新阅读了您的代码,您似乎可以通过这种方式编辑代码并创建列表:
public static List<T> CreateMyList<T>(System.Enum value)
{
switch(GetEnumDescription(value).ToLower())
{
case "datetime":
return new List<DateTime>();
case "string":
return new List<String>();
case "int":
return new List<Int32>();
default:
Utilities.log("Unkwown datatype",LogType.ErrorEntry);
return new List<Object>();
}
}
公共静态列表CreateMyList(System.Enum值)
{
开关(GetEnumDescription(value).ToLower())
{
案例“日期时间”:
返回新列表();
大小写“字符串”:
返回新列表();
案例“int”:
返回新列表();
违约:
日志(“未知数据类型”,LogType.ErrorEntry);
返回新列表();
}
}
Type listType=typeof(列表)。MakeGenericType(类型);
IList list=(IList)Activator.CreateInstance(listType);
您需要将IList.Add与对象一起使用,因为无法转换为列表。我重新阅读了您的代码,您似乎可以通过这种方式编辑代码并创建列表:
public static List<T> CreateMyList<T>(System.Enum value)
{
switch(GetEnumDescription(value).ToLower())
{
case "datetime":
return new List<DateTime>();
case "string":
return new List<String>();
case "int":
return new List<Int32>();
default:
Utilities.log("Unkwown datatype",LogType.ErrorEntry);
return new List<Object>();
}
}
公共静态列表CreateMyList(System.Enum值)
{
开关(GetEnumDescription(value).ToLower())
{
案例“日期时间”:
返回新列表();
大小写“字符串”:
返回新列表();
案例“int”:
返回新列表();
违约:
日志(“未知数据类型”,LogType.ErrorEntry);
返回新列表();
}
}
您可能需要Activator.CreateInstance方法(类型)
string[]instances=instanceSpec.Split(“;”);
Array instlist=Array.CreateInstance(typeof(object),instances.Length);
目标项目;
for(int i=0;i
您可能需要Activator.CreateInstance方法(类型)
string[]instances=instanceSpec.Split(“;”);
Array instlist=Array.CreateInstance(typeof(object),instances.Length);
目标项目;
for(int i=0;i
林克去营救
var type = MyExtensions.GetDataType(column as Enum);
DataTable dtAscen; //=logic to read table;
List<object> listBeforeSort = (from x in dtAscen.AsEnumerable()
select (object)Convert.ChangeType(x.Field<string>(column.ToString()), type)).ToList();
var temp = listBeforeSort.OrderBy(s => s);
if(!listBeforeSort.SequenceEqual(temp))
Utilities.log("Issue with ascending sort on column " + column.ToString(), LogType.ErrorEntry);
var type=MyExtensions.GetDataType(列作为枚举);
数据表dtAscen//=读表逻辑;
List listBeforeSort=(从dtassen.AsEnumerable()中的x开始)
选择(对象)Convert.ChangeType(x.Field(column.ToString()),type)).ToList();
var temp=listBeforeSort.OrderBy(s=>s);
如果(!listBeforeSort.SequenceEqual(temp))
log(“列“+column.ToString(),LogType.ErrorEntry上的升序排序问题”);
Linq重新启动
string[] instances = instanceSpec.Split(';');
Array instlist = Array.CreateInstance(typeof(object), instances.Length);
object item;
for (int i = 0; i < instances.Length; i++)
{
// create the object from the specification string
Console.WriteLine("Creating instance of: {0}", instances[i]);
item = Activator.CreateInstance(Type.GetType(instances[i]));
instlist.SetValue(item, i);
}
Console.WriteLine("\nObjects and their default values:\n");
foreach (object o in instlist)
{
Console.WriteLine("Type: {0}\nValue: {1}\nHashCode: {2}\n",
o.GetType().FullName, o.ToString(), o.GetHashCode());
}
var type = MyExtensions.GetDataType(column as Enum);
DataTable dtAscen; //=logic to read table;
List<object> listBeforeSort = (from x in dtAscen.AsEnumerable()
select (object)Convert.ChangeType(x.Field<string>(column.ToString()), type)).ToList();
var temp = listBeforeSort.OrderBy(s => s);
if(!listBeforeSort.SequenceEqual(temp))
Utilities.log("Issue with ascending sort on column " + column.ToString(), LogType.ErrorEntry);