C# 将对象变量传递给方法-指定的强制转换无效
我有一个对象列表(它们的类型事先未知)。下面的示例显示了硬编码的值,但我的实际代码通过读取CSV文件来填充args列表。然后我想将这个参数列表传递给一个典型的方法,该方法要求特定的参数。因此,我将元素转换为所需的类型,如图所示。我得到一个错误: 指定的强制转换无效 当在运行时调用该方法时。我该如何着手实现这一点C# 将对象变量传递给方法-指定的强制转换无效,c#,object,types,casting,C#,Object,Types,Casting,我有一个对象列表(它们的类型事先未知)。下面的示例显示了硬编码的值,但我的实际代码通过读取CSV文件来填充args列表。然后我想将这个参数列表传递给一个典型的方法,该方法要求特定的参数。因此,我将元素转换为所需的类型,如图所示。我得到一个错误: 指定的强制转换无效 当在运行时调用该方法时。我该如何着手实现这一点 var args = new List<object>(); args.Add(5495); args.Add("String1");
var args = new List<object>();
args.Add(5495);
args.Add("String1");
args.Add(10133);
args.Add("String2");
result = request.GetCustomer((long) args[0], (string) args[1], (int) args[2], (string) args[3]);
var args=new List();
参数添加(5495);
参数添加(“String1”);
参数添加(10133);
参数添加(“String2”);
结果=request.GetCustomer((长)参数[0],(字符串)参数[1],(int)参数[2],(字符串)参数[3]);
问题是5495将有一个int类型,您试图将其转换为long。你可以用几种方法来解决这个问题,这里是其中之一
替换这个
(long) args[0]
有了这个,
(long) (int) args[0]
然而,这不是一个非常有用的解决方案,因为您永远不可能实际地向方法传递长值,相反,您可以这样做
args.Add((long) 5495);
问题是5495将有一个int类型,您试图将其转换为long。你可以用几种方法来解决这个问题,这里是其中之一 替换这个
(long) args[0]
有了这个,
(long) (int) args[0]
然而,这不是一个非常有用的解决方案,因为您永远不可能实际地向方法传递长值,相反,您可以这样做
args.Add((long) 5495);
将值类型添加到
列表()
时
该项目将被删除。上行导致
5495
从int
装箱。要unbox,您需要显式地将args[0]
转换为其类型-(int)args[0]
。因此,如果您的方法接受long
作为其第一个参数,请执行(long)(int)args[0]
。将值类型添加到List()
时,可以取消对args[0]
的装箱,然后将值强制转换为long
该项目将被删除。上行导致
5495
从int
装箱。要unbox,您需要显式地将args[0]
转换为其类型-(int)args[0]
。因此,如果您的方法接受long
作为其第一个参数,请执行(long)(int)args[0]
。您可以取消绑定args[0]
,然后将值强制转换为long
尝试使用Convert.ChangeType
var args = new List<object>();
args.Add(5495);
args.Add("String1");
args.Add(10133);
args.Add("String2");
long aLong = (long)Convert.ChangeType(args[0], typeof(long), CultureInfo.InvariantCulture);
string aStr = (string)Convert.ChangeType(args[1], typeof(string), CultureInfo.InvariantCulture);
int aInt = (int)Convert.ChangeType(args[2], typeof(int), CultureInfo.InvariantCulture);
var args=new List();
参数添加(5495);
参数添加(“String1”);
参数添加(10133);
参数添加(“String2”);
long-aLong=(long)Convert.ChangeType(args[0],typeof(long),CultureInfo.InvariantCulture);
字符串asr=(string)Convert.ChangeType(args[1],typeof(string),CultureInfo.InvariantCulture);
int aInt=(int)Convert.ChangeType(args[2],typeof(int),CultureInfo.InvariantCulture);
尝试使用Convert.ChangeType
var args = new List<object>();
args.Add(5495);
args.Add("String1");
args.Add(10133);
args.Add("String2");
long aLong = (long)Convert.ChangeType(args[0], typeof(long), CultureInfo.InvariantCulture);
string aStr = (string)Convert.ChangeType(args[1], typeof(string), CultureInfo.InvariantCulture);
int aInt = (int)Convert.ChangeType(args[2], typeof(int), CultureInfo.InvariantCulture);
var args=new List();
参数添加(5495);
参数添加(“String1”);
参数添加(10133);
参数添加(“String2”);
long-aLong=(long)Convert.ChangeType(args[0],typeof(long),CultureInfo.InvariantCulture);
字符串asr=(string)Convert.ChangeType(args[1],typeof(string),CultureInfo.InvariantCulture);
int aInt=(int)Convert.ChangeType(args[2],typeof(int),CultureInfo.InvariantCulture);
为存储列表数据创建单独的类
课堂测试{
私有长变量1{get;set;}
私有字符串变量2{get;set;}
私有长变量3{get;set;}
私有字符串变量4{get;set;}
}
var args=新列表()
var obj=新测试{
变量1=5495
Variable2=“String1”
变量3=10133
Variable4=“String2”
}
参数添加(obj)
结果=request.GetCustomer(args[0]。Variable1,args[0]。Variable2,args[0]。Variable3,args[0]。Variable4);
为存储列表数据创建单独的类 课堂测试{ 私有长变量1{get;set;} 私有字符串变量2{get;set;} 私有长变量3{get;set;} 私有字符串变量4{get;set;} } var args=新列表() var obj=新测试{ 变量1=5495 Variable2=“String1” 变量3=10133 Variable4=“String2” } 参数添加(obj) 结果=request.GetCustomer(args[0]。Variable1,args[0]。Variable2,args[0]。Variable3,args[0]。Variable4);
让我们把问题简化一点
var args = new List<object>();
args.Add(5495);
var l = (long)args[0]; // throws an exception
一切都会好的
在解除绑定后,您可以将该值强制转换为与之兼容的任何内容
您可以在上阅读有关装箱和取消装箱的更多信息。如果你想有效地使用C#,这是一个非常宝贵的理解
问题的根本原因是您正在使用
列表
,这使得装箱不可避免。很少有人真的需要这样做,您可能应该仔细考虑您的体系结构以避免它。让我们将问题简化一点
var args = new List<object>();
args.Add(5495);
var l = (long)args[0]; // throws an exception
一切都会好的
在解除绑定后,您可以将该值强制转换为与之兼容的任何内容
您可以在上阅读有关装箱和取消装箱的更多信息。如果你想有效地使用C#,这是一个非常宝贵的理解
问题的根本原因是您正在使用
列表
,这使得装箱不可避免。很少有人真的需要这样做,您可能应该仔细考虑您的体系结构以避免这种情况。错误明确地告诉您为什么不能执行强制转换,包括对象的实际类型以及您试图将其强制转换为什么。如果希望对象在运行时不会失败,则需要将对象强制转换为其实际类型。好的开始是围绕该对象设置一个try-catch块和一个计数,以便您可以看到csv中的哪一行是罪魁祸首。@Kell atry
/catch
块只会掩盖问题。他已经可以看到错误,他只需要修复代码中的错误