使用反射,如何使用最少的代码获得使用C#3.0/.NET 3.5实现接口的所有类型,并最大限度地减少迭代?
这就是我想要重写的内容:
foreach (Type t in this.GetType().Assembly.GetTypes())
if (t is IMyInterface)
; //do stuff
Run Code Online (Sandbox Code Playgroud) 我有一个抽象类:
abstract class AbstractDataExport
{
public string name;
public abstract bool ExportData();
}
Run Code Online (Sandbox Code Playgroud)
我有从AbstractDataExport派生的类:
class XmlExport : AbstractDataExport
{
new public string name = "XmlExporter";
public override bool ExportData()
{
...
}
}
class CsvExport : AbstractDataExport
{
new public string name = "CsvExporter";
public override bool ExportData()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?(伪代码:)
foreach (Implementation imp in Reflection.GetInheritedClasses(AbstractDataExport)
{
AbstractDataExport derivedClass = Implementation.CallConstructor();
Console.WriteLine(derivedClass.name)
}
Run Code Online (Sandbox Code Playgroud)
输出像
CsvExporter
XmlExporter
Run Code Online (Sandbox Code Playgroud)
?
这背后的想法是创建一个派生自AbstractDataExport的新类,这样我就可以自动遍历所有实现并将名称添加到Dropdown-List.我只是想编译派生类而不改变项目中的任何其他内容,重新编译,宾果游戏!
如果您有其他解决方案:告诉他们.
谢谢
如何获得实现特定开放泛型类型的所有类型?
例如:
public interface IUserRepository : IRepository<User>
Run Code Online (Sandbox Code Playgroud)
找到所有实现的类型IRepository<>.
public static IEnumerable<Type> GetAllTypesImplementingOpenGenericType(Type openGenericType, Assembly assembly)
{
...
}
Run Code Online (Sandbox Code Playgroud) 我有以下课程
[XmlRoot]
public class AList
{
public List<B> ListOfBs {get; set;}
}
public class B
{
public string BaseProperty {get; set;}
}
public class C : B
{
public string SomeProperty {get; set;}
}
public class Main
{
public static void Main(string[] args)
{
var aList = new AList();
aList.ListOfBs = new List<B>();
var c = new C { BaseProperty = "Base", SomeProperty = "Some" };
aList.ListOfBs.Add(c);
var type = typeof (AList);
var serializer = new XmlSerializer(type);
TextWriter w = …Run Code Online (Sandbox Code Playgroud) class Foo { }
class Foo1 : Foo { }
class Foo2 : Foo { }
Run Code Online (Sandbox Code Playgroud)
我怎样才能将所有使用Foo的类作为基类?在同一程序集中不需要继承的类.
我正在尝试使用以下代码来获取IEntityModelBuilder的所有实现,但它将返回一个空集合。
public class EntityFrameworkDbContext : DbContext
{
//constructor(s) and entities DbSets...
private static IEnumerable<IEntityModelBuilder<IEntity>> _entitymodelBuilders;
internal IEnumerable<IEntityModelBuilder<IEntity>> EntityModelBuilders
{
get
{
if (_entitymodelBuilders == null)
{
var type = typeof(IEntityModelBuilder<IEntity>);
_entitymodelBuilders = Assembly.GetAssembly(type).GetTypes()
.Where(t => type.IsAssignableFrom(t) && t.IsClass)
.Select(t => (IEntityModelBuilder<IEntity>)Activator.CreateInstance(t, new object[0]));
}
return _entitymodelBuilders;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
foreach (var builder in EntityModelBuilders)
builder.Build(modelBuilder);
base.OnModelCreating(modelBuilder);
}
}
internal interface IEntityModelBuilder<TEntity> where TEntity : IEntity
{
void Build(DbModelBuilder modelBuilder);
}
//sample implementation
internal class UserModelBuilder …Run Code Online (Sandbox Code Playgroud) c# ×7
reflection ×6
generics ×2
inheritance ×2
.net ×1
assemblies ×1
c#-3.0 ×1
lambda ×1
optimization ×1
xmlinclude ×1