【问题标题】:Passing arguments to Activator.CreateInstance<T>() depending on Class child根据 Class child 将参数传递给 Activator.CreateInstance<T>()
【发布时间】:2019-03-14 00:14:12
【问题描述】:

我正在通过许多奇怪的东西自学 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&lt;T&gt;()。如果随机生成器选择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&lt;T&gt;() 参数传递。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

    正如您知道选择的类型,您可以使用不同的参数进行实例化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2012-09-24
      • 2021-12-30
      • 2018-03-12
      相关资源
      最近更新 更多