gpt4 book ai didi

c# - 如何在 C# 中用字符串实例化对象并发送参数?

转载 作者:行者123 更新时间:2023-11-30 19:03:58 25 4
gpt4 key购买 nike

下面的代码可以很好地产生这个输出:

This is page one.
This is page two.

但我该如何更改它,以便从 List<string> 实例化 PageItem 对象动态

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestInstant
{
class Program
{
static void Main(string[] args)
{
List<string> pageItemsIdCodes = new List<string>() { "PageItem1", "PageItem2" };
PageItemManager pageItemManager = new PageItemManager(pageItemsIdCodes);
pageItemManager.DisplayMenu();

Console.ReadLine();
}
}

class PageItemManager
{
private Dictionary<string, BasePageItem> PageItemRecords = new Dictionary<string, BasePageItem>();
public PageItemManager(List<string> pageItemsIdCodes)
{
//manually
PageItemRecords.Add("PageItem1", new PageItem1(this));
PageItemRecords.Add("PageItem2", new PageItem2(this));

//HOW DO i DO THIS DYNAMICALLY:
//PSEUDO-CODE:
//foreach (string pageItemIdCode in pageItemsIdCodes)
//{
// Type t = Type.GetType(pageItemIdCode);
// //ERROR: Cannot implicitly convert type 'TestInstant.PageItemManager' to 'TestInstant.BasePageItem'
// BasePageItem pageItem = Activator.CreateInstance(t, new BasePageItem[] { this });
// PageItemRecords.Add(pageItemIdCode, pageItem);
//}

//Type t = Type.GetType(pageItemIdCode);
//ERROR: Cannot implicitly convert type 'object' to 'TestInstant.BasePageItem'.
//BasePageItem pageItem = Activator.CreateInstance(t); // Change constructor
//pageItem.PageItemManager = this; // Add SetMananger call to BasePageItem
//PageItemRecords.Add(pageItemIdCode, pageItem);

}

public void DisplayMenu()
{
foreach (var pageItemRecord in PageItemRecords)
{
Console.WriteLine(pageItemRecord.Value.Title);
}
}
}

class BasePageItem
{
public string Title { get; set; }
protected PageItemManager pageItemManager;
public BasePageItem(PageItemManager pageItemManager)
{
this.pageItemManager = pageItemManager;
}
}

class PageItem1 : BasePageItem
{
public PageItem1(PageItemManager pageItemManager)
: base(pageItemManager)
{
Title = "This is page one.";
}
}

class PageItem2 : BasePageItem
{
public PageItem2(PageItemManager pageItemManager)
: base(pageItemManager)
{
Title = "This is page two.";

}
}
}

最佳答案

我相信你可以使用 Activator.CreateInstance接受输入参数。

foreach (string pageItemIdCode in pageItemsIdCodes)
{
Type t = Type.GetTypeFromProgID(pageItemIdCode);
Object pageItem = Activator.CreateInstance(t, new object[]{this});
PageItemRecords.Add(pageItemIdCode, pageItem);
}

或者像 groo 说的那样,直接施放它:

foreach (string pageItemIdCode in pageItemsIdCodes)
{
Type t = Type.GetTypeFromProgID(pageItemIdCode);
BasePageItem pageItem = (BasePageItem)Activator.CreateInstance(t, new object[]{this});
PageItemRecords.Add(pageItemIdCode, pageItem);
}

如果您想要返回实际类型,您还可以执行以下操作:

foreach (string pageItemIdCode in pageItemsIdCodes)
{
Type t = Type.GetTypeFromProgID(pageItemIdCode);
BasePageItem pageItem = Activator.CreateInstance(t); // Change constructor
pageItem.SetMananger(this); // Add SetMananger call to BasePageItem
PageItemRecords.Add(pageItemIdCode, pageItem);
}

这是完整的工作示例:

using System;
using System.Collections.Generic;
using System.Text;

namespace TestInstant
{
class Program
{
static void Main(string[] args)
{
List<string> pageItemsIdCodes = new List<string>();
pageItemsIdCodes.Add("PageItem1");
pageItemsIdCodes.Add("PageItem2");
PageItemManager pageItemManager = new PageItemManager(pageItemsIdCodes);
pageItemManager.DisplayMenu();

Console.ReadLine();
}
}

class PageItemManager
{
private Dictionary<string, BasePageItem> PageItemRecords = new Dictionary<string, BasePageItem>();
public PageItemManager(List<string> pageItemsIdCodes)
{
//manually
//PageItemRecords.Add("PageItem1", new PageItem1(this));
//PageItemRecords.Add("PageItem2", new PageItem2(this));

foreach (string pageItemIdCode in pageItemsIdCodes)
{
Type t = Type.GetType("TestInstant."+pageItemIdCode);
BasePageItem pageItem = (BasePageItem)Activator.CreateInstance(t, new Object[] { this });
PageItemRecords.Add(pageItemIdCode, pageItem);
}

}

public void DisplayMenu()
{
foreach (BasePageItem pageItemRecord in PageItemRecords.Values)
{
Console.WriteLine(pageItemRecord.Title);
}
}
}

class BasePageItem
{
private string mTitle;
public string Title { get { return mTitle; } set { mTitle = value; } }
protected PageItemManager pageItemManager;
public BasePageItem(PageItemManager pageItemManager)
{
this.pageItemManager = pageItemManager;
}
}

class PageItem1 : BasePageItem
{
public PageItem1(PageItemManager pageItemManager)
: base(pageItemManager)
{
Title = "This is page one.";
}
}

class PageItem2 : BasePageItem
{
public PageItem2(PageItemManager pageItemManager)
: base(pageItemManager)
{
Title = "This is page two.";

}
}
}

关于c# - 如何在 C# 中用字符串实例化对象并发送参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com