[英]Passing arguments to Activator.CreateInstance<T>() depending on Class child
我正在學習很多奇怪的東西,獨自學習C#,這一天對我來說真的很難。 在第三個問題中(到目前為止,我無法在stackoverflow上的任何書,網站或問題中找到答案)可能是最困難的一個。
現在,我正在嘗試創建一個隨機項生成器,該生成器將從3種可能的情況下實例化一個隨機類: Weapon
, Tool
和Beverage
。
現在,我正在使用此問題的正確答案來生成項目:
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.