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。。。因为首先它只是说你可以把它变成通用的,而这并不是全部的解决方案。既然这篇文章已经更新了,它涵盖了一切。我是说演员不是
是的。我会尽快尝试这个和其他一些解决方案,然后我会通知你。非常感谢。