如何创建和使用运行时已知类型的堆栈



我有一个方法,可以为运行时指定的类型创建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);
}

最新更新