根据Class子级将参数传递给Activator.CreateInstance <t>()

时间:2019-03-14 00:14:12

标签: c# .net

我正在学习很多怪异的东西,独自学习C#,这一天对我来说真的很困难。在第三个问题中(我无法在stackoverflow上的任何书籍,网站或问题上找到答案)可能是迄今为止最困难的一个问题。

现在,我正在尝试创建一个随机项生成器,该生成器将从3种可能的情况下实例化随机类:WeaponToolBeverage

现在,我正在使用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,则这些args将成为名称,价格和风味。

所以,我可以在哪里存储这样的数据:

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>()参数传递。

1 个答案:

答案 0 :(得分:0)

如果您使用的是c#7或更高版本,则可以使用“ is”运算符来了解所选的类型。 您可以在这里找到参考:https://docs.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/is

您知道所选的类型,可以使用不同的参数实例化。

对于较旧版本的C#,您可以使用“ typeof”实现