C# 确定作为参数发送的对象类型
我有三个班,分别是个人班、城市班、地区班和其他班 我将这三个类中的一个作为函数参数发送。我想做一个操作,这取决于这三个选项中的哪一个已发送。我该怎么做?这三个类都扩展了实体类 现在就像:C# 确定作为参数发送的对象类型,c#,C#,我有三个班,分别是个人班、城市班、地区班和其他班 我将这三个类中的一个作为函数参数发送。我想做一个操作,这取决于这三个选项中的哪一个已发送。我该怎么做?这三个类都扩展了实体类 现在就像: public void Insert (City newCity) 但我希望它是这样的: public void Insert (Entity e) 或者类似的东西,无论是城市还是个人,我都想使用它的财产 谢谢大家! 只需使用is和as运算符即可: public void Insert(Entity e)
public void Insert (City newCity)
但我希望它是这样的:
public void Insert (Entity e)
或者类似的东西,无论是城市还是个人,我都想使用它的财产
谢谢大家! 只需使用is和as运算符即可:
public void Insert(Entity e)
{
if (e is Person)
{
Person tmp = e as Person;
//do your code
}
else if (e is City)
{
City tmp = e as City;
//do your code
}
else if(e is District)
{
District tmp = e as District;
//do your code
}
}
public class Entity
{
public virutal void Insert (Entity e)
{
// TODO logic for Entity
}
}
public class City : Entity
{
public override void Insert (City city)
{
// TODO logic for City
}
}
只需以这种方式使用is和as运算符:
public void Insert(Entity e)
{
if (e is Person)
{
Person tmp = e as Person;
//do your code
}
else if (e is City)
{
City tmp = e as City;
//do your code
}
else if(e is District)
{
District tmp = e as District;
//do your code
}
}
public class Entity
{
public virutal void Insert (Entity e)
{
// TODO logic for Entity
}
}
public class City : Entity
{
public override void Insert (City city)
{
// TODO logic for City
}
}
您可以将其设置为通用:
public void Insert<T>(T entity) where T: Entity
{
}
您可以将其设置为通用:
public void Insert<T>(T entity) where T: Entity
{
}
一种方法是使用继承和强制转换,如下所示:
public abstract class Entity
{
public int Id { get; set; }
}
public class City : Entity
{
public string CityName { get; set; }
}
public class Person : Entity
{
public string PersonName { get; set; }
}
public class MethodHost
{
public void Insert(Entity e)
{
if (e is Person person)
{
// Do something with person
} else if (e is City cityName)
{
// Do something with city
}
}
}
var city = e as city
if(city != null)
{
// Do something with city
}
注:我在这里使用了一些新的C功能,如果您使用的是旧版本的C,您可能需要执行以下操作:
public abstract class Entity
{
public int Id { get; set; }
}
public class City : Entity
{
public string CityName { get; set; }
}
public class Person : Entity
{
public string PersonName { get; set; }
}
public class MethodHost
{
public void Insert(Entity e)
{
if (e is Person person)
{
// Do something with person
} else if (e is City cityName)
{
// Do something with city
}
}
}
var city = e as city
if(city != null)
{
// Do something with city
}
您也可以在if中使用is,在if标记中使用cast,但这并不是最有效的方法,因为它会强制转换两次而不是一次。一种方法是使用继承和强制转换,如下所示:
public abstract class Entity
{
public int Id { get; set; }
}
public class City : Entity
{
public string CityName { get; set; }
}
public class Person : Entity
{
public string PersonName { get; set; }
}
public class MethodHost
{
public void Insert(Entity e)
{
if (e is Person person)
{
// Do something with person
} else if (e is City cityName)
{
// Do something with city
}
}
}
var city = e as city
if(city != null)
{
// Do something with city
}
注:我在这里使用了一些新的C功能,如果您使用的是旧版本的C,您可能需要执行以下操作:
public abstract class Entity
{
public int Id { get; set; }
}
public class City : Entity
{
public string CityName { get; set; }
}
public class Person : Entity
{
public string PersonName { get; set; }
}
public class MethodHost
{
public void Insert(Entity e)
{
if (e is Person person)
{
// Do something with person
} else if (e is City cityName)
{
// Do something with city
}
}
}
var city = e as city
if(city != null)
{
// Do something with city
}
您还可以在if中使用is,并在if标记中使用cast,但这不是最有效的方法,因为它会强制转换两次而不是一次。最好的方法是实现不同的方法。如果它们内部有一些通用的逻辑,只需将其带到不同的方法并调用它即可
public void Insert (City newCity)
{
// TODO logic for City
}
public void Insert (Entity e)
{
// TODO logic for Entity
}
另一种方法是继承。如果城市可以从实体中派生出来,那么最好这样做:
public void Insert(Entity e)
{
if (e is Person)
{
Person tmp = e as Person;
//do your code
}
else if (e is City)
{
City tmp = e as City;
//do your code
}
else if(e is District)
{
District tmp = e as District;
//do your code
}
}
public class Entity
{
public virutal void Insert (Entity e)
{
// TODO logic for Entity
}
}
public class City : Entity
{
public override void Insert (City city)
{
// TODO logic for City
}
}
最好的方法是实施不同的方法。如果它们内部有一些通用的逻辑,只需将其带到不同的方法并调用它即可
public void Insert (City newCity)
{
// TODO logic for City
}
public void Insert (Entity e)
{
// TODO logic for Entity
}
另一种方法是继承。如果城市可以从实体中派生出来,那么最好这样做:
public void Insert(Entity e)
{
if (e is Person)
{
Person tmp = e as Person;
//do your code
}
else if (e is City)
{
City tmp = e as City;
//do your code
}
else if(e is District)
{
District tmp = e as District;
//do your code
}
}
public class Entity
{
public virutal void Insert (Entity e)
{
// TODO logic for Entity
}
}
public class City : Entity
{
public override void Insert (City city)
{
// TODO logic for City
}
}
在C7.0中,可以使用模式匹配
public void Insert(Entity e)
{
switch (e)
{
case Person p:
Console.WriteLine("Insert Person");
break;
case City c:
Console.WriteLine("Insert City");
break;
default:
Console.WriteLine("<other>");
break;
}
}
在C7.0中,可以使用模式匹配
public void Insert(Entity e)
{
switch (e)
{
case Person p:
Console.WriteLine("Insert Person");
break;
case City c:
Console.WriteLine("Insert City");
break;
default:
Console.WriteLine("<other>");
break;
}
}
假设多态性是不可能的,即做。。。;,那么也许ife是城市{…}或者如果e是人{…}或者如果e是地区{…}?如果没有更多的代码,很难猜测你在这里做什么。但是查看is或as运算符来确定您处理的是哪种类型的类型/类?对方法的参数进行类型检查似乎很奇怪,而不仅仅是对每个实体使用不同的方法…@Christian.K我正在制作一个具有分层架构的数据库应用程序,只是为了学习。在表示层,如果用户想添加一个人,我从用户那里获取信息并将其用于业务和数据层。确定它是哪个实体,并在数据层中使用它将其添加到数据库中。@Chris我考虑过,但我至少有4个操作,如更新、删除、选择等。如果我对其他方法也使用重载,这不是有点复杂吗?另外,我想学习我所问的方法。假设多态性不可能,即,进行。。。;,那么也许ife是城市{…}或者如果e是人{…}或者如果e是地区{…}?如果没有更多的代码,很难猜测你在这里做什么。但是查看is或as运算符来确定您处理的是哪种类型的类型/类?对方法的参数进行类型检查似乎很奇怪,而不仅仅是对每个实体使用不同的方法…@Christian.K我正在制作一个具有分层架构的数据库应用程序,只是为了学习。在表示层,如果用户想添加一个人,我从用户那里获取信息并将其用于业务和数据层。确定它是哪个实体,并在数据层中使用它将其添加到数据库中。@Chris我考虑过,但我至少有4个操作,如更新、删除、选择等。如果我对其他方法也使用重载,这不是有点复杂吗?另外,我想学习我问的方法。很好的解决方案,但op想要访问他们的属性,而这些属性不会像这样工作,你需要强制转换。至少我是这样理解的it@EpicKip:除非重载该方法,否则除了强制转换之外没有其他选项。虽然施法有什么不对??@VisualIncentWell。。。因为首先它只是说你可以把它变成通用的,而这并不是全部的解决方案。既然这篇文章已经更新了,它涵盖了一切。我是说演员没有被覆盖是的。我会尽快尝试这个和其他一些解决方案,然后我会通知你。非常感谢。很好的解决方案,但op想要访问它们的属性,而这些属性不会像这样工作,您需要强制转换。至少我是这样理解的it@EpicKip:除非重载该方法,否则除了强制转换之外没有其他选项。虽然施法有什么不对??@VisualIncentWell。。。因为首先它只是说你可以把它变成通用的,而这并不是全部的解决方案。既然这篇文章已经更新了,它涵盖了一切。我是说演员不是
是的。我会尽快尝试这个和其他一些解决方案,然后我会通知你。非常感谢。