【发布时间】:2019-03-14 00:14:12
【问题描述】:
我正在通过许多奇怪的东西自学 C#,这一天对我来说真的很困难。在这第三个问题中(我在任何书籍、网站或 stackoverflow 中的问题上都找不到答案)可能是迄今为止最难的一个。
现在我正在尝试创建一个随机项目生成器,它将从 3 个可能实例中实例化一个随机类:Weapon、Tool 和 Beverage。
现在,我正在使用来自this 问题的正确答案来生成一个项目:
public void randomGenerate()
{
var runningAssembly = Assembly.GetExecutingAssembly();
var itemType = typeof(Item);
List<Type> allItemTypes = runningAssembly.GetTypes().Where
(
type => itemType.IsAssignableFrom(type)
).ToList();
int randomIndex = RandomNumberGenerator.NumberBetween(0, allItemTypes.Count);
var selectedType = allItemTypes[randomIndex];
var selected = (Item)Activator.CreateInstance(selectedType);
}
但我想根据所选的类将一些参数传递给Activator.CreateInstance<T>()。如果随机生成器选择Weapon 类,它应该传递一个填充了随机属性的对象,例如:MinimumDamage、MaximumDamage、Material、Classification、Name 等。如果是Beverage,这些参数将是 Name、Price和风味。
那么,我可以在哪里存储这样的数据:
List<string> namesList = new List<string>() { "Water", "Milk", "Tea", "Coffee", "Wine", "Juice" };
List<string> flavorsList = new List<string>() { "Cherry", "Strawberry", "Orange", "Lemon", "Pineapple", "Mango" };
并从每个列表(在对象内)传递一个随机元素?:
Object[] args = { nameIndex, flavorIndex };
为什么有这两个论点?因为它们是创建Beverage所必需的:
class Beverage : item
{
public string Flavor { get; set; }
public Beverage
(
string name,
string flavor
) : base(name)
{
Flavor = flavor;
}
}
我知道如何生成这些随机元素,所以主要的两个问题是:
1) 将属性列表存储在某处,以便我能够找到它们。
2) 获取这些列表(取决于所选的类),生成一个可以存储每个必需参数的对象(我知道如何生成该对象)并将该对象作为Activator.CreateInstance<T>() 参数传递。
【问题讨论】: