我有一个方法,可以为运行时指定的类型创建Stack
,如
public object CreateStackForType(Type childType)
{
return Activator.CreateInstance(typeof(Stack<>).MakeGenericType(childType));
}
这似乎可以创建Stack
对象,但现在我不知道如何将返回的对象强制转换为正确类型的Stack
,以便将元素推到它上面
例如
public object FillStack(Type childType, object[] values)
{
object myStack = CreateStackForType(childType);
foreach (object value in values)
{
// I want to push 'value' onto 'myStack', but I don't know how to cast 'myStack'
// I want something like ((Stack<childType>)myStack).Push(value)
}
return myStack;
}
我试着做((Stack<object>)myStack).Push(value)
,但这给告诉我";指定的强制转换无效";。
您可以使用dynamic
关键字和Convert.ChangeType
方法
FillStack(typeof(int), new object[] {1, 2, 3});
/****/
public static object FillStack(Type childType, object[] values)
{
// myStack is a Stack<int> in that instance
dynamic myStack = CreateStackForType(childType);
foreach (object value in values)
{
// val is an int in that instance
dynamic val = Convert.ChangeType(value, childType);
myStack.Push(val);
}
return myStack;
}
public object CreateStackForType(Type childType, out Delegate obj)
{
var instance = Activator.CreateInstance(typeof(Stack<>).MakeGenericType(childType));
obj = Delegate.CreateDelegate(typeof(Action<>).MakeGenericType(childType), instance, "Push");
return instance;
}
public object FillStack(Type childType, object[] values)
{
object myStack = CreateStackForType(childType, out Delegate push);
foreach (object value in values)
push.DynamicInvoke(value);
return myStack;
}
但是,当添加大量数据时,这是低效的。
如果您只想用数组初始化堆栈,这会更有效。
public object FillStack(Type childType, Array values)
{
return Activator.CreateInstance(typeof(Stack<>).MakeGenericType(childType), values);
}