检查并比较两个对象



我有一个可构建的抽象类,它继承了房屋和道路类。

我正在尝试对包含房屋和道路的可构建对象数组进行分类。

我知道我可以像这样检查一个对象是否是这样的 Road:f(myBuildables[i] is Road)并且它运行良好,但出于可伸缩性的原因,我希望有一个包含从 Buildable 继承的类的数组。我尝试了一些东西,但显然它不起作用:class[] inheritTypes = { House, Road }

我也尝试过使用Types[] buildableTypes = { typeOf(Hosue), typeOf(Road) }类型数组,但我无法比较这些类型,因为typeOf(myBuildables[i])总是返回可构建类型。

is检查实例但针对类型的等效功能是Type.IsAssignableFrom(文档(。

在您的情况下:

if (typeof(House).IsAssignableFrom(obj.GetType()))
{
//obj is a house
}

因此,您可以将类型保留在数组中,然后根据该数组的内容动态做出决策。

给定

public abstract class Buildable{}
class Road : Buildable{}
class House : Buildable{}

您可以执行以下操作

List<Buildable> buildables = new List<Buildable>();
buildables.Add(new House());
buildables.Add(new Road());
buildables.Add(new House());
foreach(var item in buildables)
{
if(item is House)
{
Console.WriteLine("House");
}
if (item is Road)
{
Console.WriteLine("Road");
}
}

或者在 C# 8.0 中,您可以执行如下所示的高级模式匹配:

abstract class Buildable { 
public bool Damage;
}
class Road : Buildable { }
class House : Buildable { }

和模式匹配:

List<Buildable> buildables = new List<Buildable>();
buildables.Add(new House());
buildables.Add(new Road());
buildables.Add(new House{  Damage = true });
foreach (var item in buildables)
{
switch (item)
{
case House damageHouse when damageHouse.Damage:
Console.WriteLine("House Damaged");
break;
case House house:
Console.WriteLine("House");
break;
case Road road:
Console.WriteLine("Road");
break;
case Buildable _:
Console.WriteLine("Default");
break;
}
}

你应该使用object。获取类型 ((:

myBuildables [I] .GetType ();

下面是一个示例代码:

class Program
{
abstract class Buildable
{
public string Name { get; set; } = string.Empty;
}
class Home : Buildable{}
class Roard: Buildable{}
static void Main(string[] args)
{
List<Type> listTypes = new List<Type>()
{
typeof(Home),
};
List<Buildable> listBuildable = new List<Buildable>()
{
new Home(){Name = "home 1"},
new Home(){Name = "home 2"},
new Home(){Name = "home 3"},
new Roard(){Name = "road 1"},
new Roard(){Name = "road 2"},
new Roard(){Name = "road 3"},
};
foreach(var item in listBuildable)
{
var itemType = item.GetType();
Console.WriteLine("Buildable name = " + item.Name);
Console.Write("item typeof" + itemType.ToString());
if (listTypes.Find(o => o.Equals(itemType)) != null)
Console.WriteLine(" - Type isset in list");
else
Console.WriteLine(" - Unknown type");
Console.WriteLine();
}
Console.ReadLine();
}
}

结果:

可构建名称 = 主页 1 项目类型控制台应用1.程序+主页 - 类型在列表中设置

可构建名称 = 主页 2 项目类型控制台应用1.程序+主页 - 类型在列表中设置

可构建名称 = 主页 3 项目类型控制台应用1.程序+主页 - 类型在列表中设置

可建造名称 = 道路 1 项目类型控制台应用1.程序+漫游 - 未知类型

可建造名称 = 道路 2 项目类型控制台应用1.程序+漫游 - 未知类型

可建造名称 = 道路 3 项目类型控制台应用1.程序+漫游 - 未知类型

相关内容

  • 没有找到相关文章

最新更新