C# 将对象变量传递给方法-指定的强制转换无效

C# 将对象变量传递给方法-指定的强制转换无效,c#,object,types,casting,C#,Object,Types,Casting,我有一个对象列表(它们的类型事先未知)。下面的示例显示了硬编码的值,但我的实际代码通过读取CSV文件来填充args列表。然后我想将这个参数列表传递给一个典型的方法,该方法要求特定的参数。因此,我将元素转换为所需的类型,如图所示。我得到一个错误: 指定的强制转换无效 当在运行时调用该方法时。我该如何着手实现这一点 var args = new List<object>(); args.Add(5495); args.Add("String1");

我有一个对象列表(它们的类型事先未知)。下面的示例显示了硬编码的值,但我的实际代码通过读取CSV文件来填充args列表。然后我想将这个参数列表传递给一个典型的方法,该方法要求特定的参数。因此,我将元素转换为所需的类型,如图所示。我得到一个错误:

指定的强制转换无效

当在运行时调用该方法时。我该如何着手实现这一点

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 a
try
/
catch
块只会掩盖问题。他已经可以看到错误,他只需要修复代码中的错误