簡體   English   中英

將參數傳遞給Activator.CreateInstance <T> ()取決於班級子級

[英]Passing arguments to Activator.CreateInstance<T>() depending on Class child

我正在學習很多奇怪的東西,獨自學習C#,這一天對我來說真的很難。 在第三個問題中(到目前為止,我無法在stackoverflow上的任何書,網站或問題中找到答案)可能是最困難的一個。

現在,我正在嘗試創建一個隨機項生成器,該生成器將從3種可能的情況下實例化一個隨機類: WeaponToolBeverage

現在,我正在使用問題的正確答案來生成項目:

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將是Name,Price和Flavor。

因此,我可以在哪里存儲這樣的數據:

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>()參數傳遞。

如果您使用的是c#7或更高版本,則可以使用“ is”運算符來了解所選的類型。 您可以在這里找到參考: https : //docs.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/is

如您所知,您可以使用不同的參數實例化類型。

對於較舊的C#版本,您可以使用“ typeof”實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM