我有三个名为Person,City和District的课程,还有一些课程。
我发送这三个类中的一个作为函数参数。我想做一个手术取决于这三个中的哪一个被发出。我怎样才能做到这一点?所有这三个类都扩展了一个实体类。
现在它就像:
public void Insert (City newCity)
但我希望它像:
public void Insert (Entity e)
或类似的东西,无论是哪个(城市或人),我都想使用它的属性。
谢谢!
答案 0 :(得分:4)
你可以把它变成通用的:
public void Insert<T>(T entity) where T: Entity
{
}
现在您可以使用Entity
的所有属性或方法。如果您需要使用仅属于子类型的属性或方法,则必须强制转换它:
public void Insert<T>(T entity) where T: Entity
{
if(entity is City)
{
City city = (City) entity;
// ...
}
else if(entity is Person)
{
Person person = (Person) entity;
// ...
}
}
答案 1 :(得分:2)
以这种方式使用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
}
}
答案 2 :(得分:0)
一种方法是使用继承和转换,如下所示:
Many2ManyField
P.S。:我在这里使用了一些新的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
}
}
}
你也可以在if-tags中使用if和if中的is - 但这并不是最高效的方式,因为它会转换两次而不是一次。
答案 3 :(得分:0)
最好的方法是实施不同的方法。如果他们内部有一些通用逻辑,只需将它带到不同的方法并调用它。
public void Insert (City newCity)
{
// TODO logic for City
}
public void Insert (Entity e)
{
// TODO logic for Entity
}
另一种方法是继承。如果City可以从Entity派生而不是更好地这样做:
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
}
}
答案 4 :(得分:0)
在C#7.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;
}
}