繁体   English   中英

如何处理某些类型的对象 c#

[英]How to deal with objects of certain types c#

我总共有 5 个类,我总是为其创建一个 object。从这个对象集合中创建一个列表,其中包含列表中的不同类型的对象。

List<object> objectsEntries = new List<object>();

所有这些对象都有我想使用的属性。

然而,这有点令人困惑。 因为对于列表中的每个条目,我首先必须检查它是哪种类型。 然后我必须投 object 才能使用它。

像这样:

public void DoSomething(object objectsEntry)
{
    if (objectsEntry is Class1)
    {
        Class1 commandTyped = (Class1)objectsEntry;

        // Now I can use the properties of Class1
        // e.g.
        // Console.WriteLine(commandTyped.Name);
    }
    else if (objectsEntry is Class2)
    {
        Class2 commandTyped = (Class2)objectsEntry;
        
        // Now I can use the properties of Class2
        // e.g.
        // Console.WriteLine(commandTyped.Name);
    }
}

但是整个方法变得非常混乱,无论我想在哪里使用对象都会出现问题,因为我总是必须先确定类型然后再转换它。

此外,所有类别都具有完全不同的属性。

是否有任何可能的解决方案或方法?

我想这样做:

public interface ISomeClasses
{
    int Id { get; set; }
}

public class SomeClass1 : ISomeClasses
{
    public int Id { get; set; }
}

public class SomeClass2 : ISomeClasses
{
    public int Id { get; set; }
}

public class Main
{
    public void DoSomething(object objectsEntry)
    {
        if (objectsEntry is ISomeClasses someClass)
        {
            Console.WriteLine(someClass.Id);
        }
    }
}

简短说明:

  • 你用你感兴趣的属性创建一个接口
  • 创建几个都实现相同接口的类
  • 在你的名为“DoSomething”的方法中,你可以检查 object 是否实现了接口,如果是,你将它分配给名为“someClass”的变量,并且你可以访问你感兴趣的属性

如果您创建一个包含方法DoSomething()的接口,您可以在所有自定义类中继承该接口并为每个类实现所需的DoSomething()方法体,例如:

public interface ISomething
{
    void DoSomething();
}

public class Class1 : ISomething
{
    public string Name { get; set; }

    public void DoSomething()
    {
        Console.WriteLine($"[{nameof(Class1)}] My name is {Name}");
    }
}

public class Class2 : ISomething
{
    public int Age { get; set; }

    public void DoSomething()
    {
        Console.WriteLine($"[{nameof(Class2)}] I am {Age} years old");
    }
}

// Other Class* implementations

然后,您可以创建一个接口类型列表,并用自定义类的对象填充它。 然后,在每个条目上调用DoSomething()将为适当的Class*类型调用指定的实现。

List<ISomething> entries = new()
{
    new Class1 { Name = "Sarah" },
    new Class2 { Age = 41 }
};

foreach (var entry in entries)
{
    entry.DoSomething();
}

产生:

[Class1] 我叫莎拉
[Class2] 我今年41岁

示例小提琴在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM