我有一个对象数组,其中我存储了不同的值类型。 其中一种是秒表。我怎么处理它? 我应该将数组元素转换为能够将其作为秒表处理?
以下是我的代码如何显示的小型复制品
public static object[] test()
{
object[] obj = new object[6];
obj[0] = bool;
obj[1] = string;
obj[2] = double;
obj[3] = float;
obj[4] = int;
obj[5] = System.Diagnostics.Stopwatch.StartNew();
return obj;
}
object[] testobject = new object[6];
testobject = test();
Console.WriteLine(testobject[5].Elapsed.TotalMilliseconds); //handle stopwatch
答案 0 :(得分:4)
也许你应该为此写下一个课程?
public class MyObject
{
public bool SomeBool {get; set;}
public string SomeString {get; set;}
public double SomeDouble {get; set;}
public float SomeFloat {get; set;}
public int SomeInt {get; set;}
public System.Diagnostics.Stopwatch Stopwatch {get; set;}
public MyObject()
{
this.Stopwatch = System.Diagnostics.Stopwatch.StartNew();
}
}
然后要使用此类,您只需要调用Stopwatch
属性:
var myObject = new MyObject();
Console.WriteLine(myObject.Stopwatch.Elapsed.TotalMilliseconds);
现在,如果你真的想知道在几毫秒内实例化一个数组需要多长时间,你有两个选择:
像这样:
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
//create your array here
Console.WriteLine(stopWatch.Elapsed.TotalMilliseconds);
无论哪种方式,最好先找出你想要完成的事情。
答案 1 :(得分:1)
你会cast它。
如果演员表无效,此演员表将抛出InvalidCastException - 如果该对象实际上不是秒表:
var stopwatch = (Stopwatch)testobject[5];
如果它不是秒表,as
operato r会给你一个null:
var stopwatch = testobject[5] as Stopwatch;
顺便说一句,您上面显示的数据结构闻起来很糟糕。如果没有这样的话,真的没有必要 - " typesafe"。您应该依赖于您的代码来准确地提供您所需的代码,而不是在运行时强制转换。因为如果你做错了 - 如果你尝试var x = (Stopwatch)object[4]
之类的东西 - 那么编译器就不会抓住它,你会得到愤怒的客户报告运行时崩溃。
通常,更喜欢将对象实例存储为实际类型,而不是原始object
。
答案 2 :(得分:1)
您有一个object
数组,因此您必须强制转换每个元素以访问其特定于类型的属性和方法:
Console.WriteLine(((Stopwatch)testobject[5]).Elapsed.TotalMilliseconds);
另一方面,绕过object
数组通常不是一个好主意。您丢失了类型信息,因此,如果您将其中一个元素更改为其他类型,则现在需要更新执行该元素转换的代码。首选创建自己的类型以保存所有数据。
答案 3 :(得分:1)
我不完全确定我理解您遇到了什么问题,但假设它基于将Stopwatch
元素放入{{1这个代码应该适合你:
object
此代码假定您知道元素5将始终为object[] testobject = test();
System.Diagnostics.Stopwatch stopwatch = (System.Diagnostics.Stopwatch) testobject[5];
Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds);
:如果不是,则会出现运行时错误。
答案 4 :(得分:1)
在投射前检查对象的类型
if (obj[5] is System.Diagnostics.Stopwatch) {
Console.WriteLine(((System.Diagnostics.StopWatch)obj[5]).Elapsed.TotalMilliseconds);
}
或检查演员表是否有效
var sw = obj[5] as System.Diaogstics.Stopwatch;
if (sw != null) {
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
}