如何动态创建一个类的对象?

3

我有一个类 MyClass

public class OPCTag
{
    public string tagName;
    public string tagOvationMatch;
    public string tagValue;
}

我知道如何手动创建一个类的对象,但如何动态地创建这个类的对象呢?例如,在for循环中创建它:

for (int i=0; i< 10; i++)
{
    //CREATE OBJECT DYNAMICALLY
}

获取MyClass的10个对象。

2
为什么不使用 List<OPCTag> 来存储10个不同的实例呢? - sujith karivelil
1
我不确定我理解你的问题... new OPCTag() 有什么问题吗? - Thomas Levesque
@ThomasLevesque,抱歉,我是个新手。但我的意思是我需要10个MyClass对象。如果我像这样写MyClass obj = new MyClass()在for循环中,如果它们都有一个名称,我该如何访问它们的属性? - Jam
4个回答

2
如果您只是想创建一个始终具有相同类型的类的实例,则以下内容就足够了:
List<OPCTag> list = new List<OPCTag>();
for (int i = 0; i < 10; i++)
{
    // Create object of OPCTag
    var obj = new OPCTag();

    // Set value for 'tagName' property 
    obj.tagName = "New value of 'tagName'";

    // Get value of 'tagName' property
    var tagNameValue = obj.tagName;

    list.Add(obj);
}

// Set value of 4th element 'tagName' property
list[4].tagName = "This is 4th element";

// Get value of 4th element 'tagName' property
var valueOf4thTag = list[4].tagName;

但如果你想使用未知类型动态创建类,你应该使用反射:

// Type namespace and name
string typeName = typeof(OPCTag).FullName; // MyNamespace.OPCTag

List<Object> list = new List<Object>();
for (int i = 0; i < 10; i++)
{
    // Create object dynamically from string type
    var obj = Type.GetType(typeName).GetConstructor(new Type[0]).Invoke(new object[0]);

    // Set value for 'tagName' property
    obj.GetType().GetProperty("tagName").SetValue(obj, "New value for 'tagName'");

    // Get value from 'tagName' property
    string tagNameValue = (string)obj.GetType().GetProperty("tagName").GetValue(obj);

    list.Add(obj);
}

谢谢!我认为我需要使用第一个。但是我有一个问题,之后我将在列表中拥有这个类的10个对象,但是我如何例如从此列表的第4个元素的属性中获取信息? - Jam
1
你应该使用这个:list[4].tagName。 - Ivan Kishchenko
我还有一个问题,如果可以的话,我能否将类的所有实例存储在字典中而不是列表中? - Jam
1
@Ramon,你可以使用Dictionary<string, OPCTag>代替List<OPCTag>。要将标签添加到字典中,应该使用“dictionary.Add(obj.tagName, obj)”,其中tagName属性是键。 - Ivan Kishchenko
1
让我们在聊天中继续这个讨论 - Ivan Kishchenko

1
你可以在循环中动态添加对象,但必须创建一个列表。你可以编写类似以下代码的内容:
List<OPCTag> lstTag = new List<OPCTag>();

for(int i = 0; i<10 ; i++)
{
     lstTag.Add(new OPCTag());
}

谢谢!但是我怎么可以从那里获取属性的信息? - Jam
1
就像其他答案中所说的那样,您可以读取列表中每个元素的所有属性:lstTag[index].propertyName = value - Alexus

1

例如,要创建10个 MyClass 对象,您可以执行以下操作:

List<MyClass> list = new List<MyClass>();
for (int i = 0; i < 10; i++)
{
    list.Add(new MyClass());    
}

尽管它不是“动态创建对象”,只是创建实例。
对于Dictionary,您应该指定键和值。它们可以是任何类型,不仅仅是int(通常是string)。
Dictionary<int, MyClass> dictionary = new Dictionary<int, MyClass>();
for (int i = 0; i < 10; i++)
{
    dictionary.Add(i, new MyClass());
}

谢谢!但是我怎么从属性中获取信息呢? - Jam
1
@Ramon,使用索引器:list[1].tagName =“tagName”; - Andrey Alonzov
如果可以的话,我还有一个问题,我能否将一个类的所有实例存储在字典中而不是列表中? - Jam
1
@Ramon,当然可以。或者你可以使用任何其他集合:队列、栈、哈希集等,甚至是数组!你最好先阅读一些关于.NET基础的书籍。 - Andrey Alonzov
你说得对,我真的应该:/ 但是我尝试过了,当我尝试添加元素时出现 System.NullReferenceException。你能否用字典而不是列表重新编写相同的代码呢? - Jam

1

//你的类

public class OPCTag
{
    public string tagName;
    public string tagOvationMatch;
    public string tagValue;
}

// 初始化一个类型为OPCTag的新列表对象

List<OPCTag> lstTag = new List<OPCTag>();

for(int i = 0; i<10 ; i++)
{
     lstTag.Add(new OPCTag());
}

//在这里,我指定列表中的0索引/第一个值,以从lstTag读取值。

var firstIndexTagname =  lstTag[0].tagName;
var firstIndexTagOvationMatch = lstTag[0].tagOvationMatch;
var firstIndexTagValue =  lstTag[0].tagValue;

非常感谢!将所有这些项目收集到字典中而不是列表中将会很棒,您知道如何做吗? - Jam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接