Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取从基实体继承的所有实体的类名_C#_Entity Framework_Inheritance - Fatal编程技术网

C# 获取从基实体继承的所有实体的类名

C# 获取从基实体继承的所有实体的类名,c#,entity-framework,inheritance,C#,Entity Framework,Inheritance,假设我有一个基本实体类: public abstract partial class Person { public Person() { } public string FirstName { get; set; } public string LastName { get; set; } } 我有多个从该实体继承的实体,例如: public partial class Customer :

假设我有一个基本实体类:

public abstract partial class Person
    {
        public Person()
        {
        }

        public string FirstName { get; set; }
        public string LastName { get; set; }


    }
我有多个从该实体继承的实体,例如:

public partial class Customer : Person
{
    public Customer()
    {
    }

    public int CustomerStatusId { get; set; }
    public string AccountNumber { get; set; }

}
还有一些从
Person
类继承的实体

是否有一种方法可以获取从
Person
类继承的所有实体类名? 我想在
选择
框中显示这些,以创建一个通用的
添加用户
方法

var names = assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)).Select(t => t.Name);
尝试上面的方法来获取名称

请参考以下答案

尝试上面的方法来获取名称


使用以下答案作为参考

您需要使用反射:

using System.IO;
using System;
using System.Reflection;
using System.Linq;

class Program
{
    static void Main()
    {
        Assembly a = typeof(Program).Assembly;

        var types = a.GetTypes().Where(i=>i.IsSubclassOf(typeof(T)));

        foreach(var i in types)
        {
            Console.WriteLine(i);
        }
    }
}

public class T {  }
public class TT : T {  }
public class TTT : T {  }

您需要使用反射:

using System.IO;
using System;
using System.Reflection;
using System.Linq;

class Program
{
    static void Main()
    {
        Assembly a = typeof(Program).Assembly;

        var types = a.GetTypes().Where(i=>i.IsSubclassOf(typeof(T)));

        foreach(var i in types)
        {
            Console.WriteLine(i);
        }
    }
}

public class T {  }
public class TT : T {  }
public class TTT : T {  }

反思是最简单的方法(如其他答案所示)

但是(由于您用
实体框架
标记了问题,并且您提到了
实体
),如果您的目的是获取数据库中存在的派生类型列表(以填充查找),您可以尝试以下方法:

var typeNames = context.Set<Person>()
                       .ToList()
                       .Select(x => x.GetType().Name)
                       .Distinct();
var typeNames=context.Set()
托利斯先生()
.Select(x=>x.GetType().Name)
.Distinct();

反射是最简单的方法(如其他答案所示)

但是(由于您用
实体框架
标记了问题,并且您提到了
实体
),如果您的目的是获取数据库中存在的派生类型列表(以填充查找),您可以尝试以下方法:

var typeNames = context.Set<Person>()
                       .ToList()
                       .Select(x => x.GetType().Name)
                       .Distinct();
var typeNames=context.Set()
托利斯先生()
.Select(x=>x.GetType().Name)
.Distinct();

看看这篇文章,我想这正是你需要的:我假设你只想知道(当前程序集/有限的程序集)中的实现,因为,当然,这是一个公共类,可能会有无限多的继承类。@Damien_the_Noisever是的,你是对的。看看这篇文章,我想这正是您需要的:我假设您只想知道(当前程序集/有限的程序集)中的实现,因为这是一个公共类,可能有无限多的继承类。@Damien_the_Noisever是的,你是对的。这应该可以,但你似乎有一个放错地方的退货声明。我同意。我已经更新了应该这样做,但你似乎有一个放错地方的返回声明。我同意。我有最新的兴趣。我通常会尽量避免使用反射,但我想知道哪一个会更“昂贵”,我的猜测是另一个db调用会比反射调用更昂贵。如果您在性能方面的意思是“昂贵”,反射可能会快得多,特别是当您的表包含许多
人时。但是,如果您要求下拉列表仅包含数据库中已经存在的类型,我想您必须使用该解决方案。我通常会尽量避免使用反射,但我想知道哪一个会更“昂贵”,我的猜测是另一个db调用会比反射调用更昂贵。如果您在性能方面的意思是“昂贵”,反射可能会快得多,特别是当您的表包含许多
人时。但是,如果您要求下拉列表仅包含数据库中已经存在的类型,我想您必须使用该解决方案。