确定作为参数发送的对象类型

时间:2017-07-07 08:47:44

标签: c#

我有三个名为Person,City和District的课程,还有一些课程。

我发送这三个类中的一个作为函数参数。我想做一个手术取决于这三个中的哪一个被发出。我怎样才能做到这一点?所有这三个类都扩展了一个实体类。

现在它就像:

public void Insert (City newCity)

但我希望它像:

public void Insert (Entity e)

或类似的东西,无论是哪个(城市或人),我都想使用它的属性。

谢谢!

5 个答案:

答案 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)

以这种方式使用isas运算符:

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;
    }
}