C# 在C语言中使用抽象类

C# 在C语言中使用抽象类,c#,.net,oop,class,C#,.net,Oop,Class,我有一个其他类继承的抽象类 public abstract class GenericAccess<TEntity> { public static IList<TEntity> GetObjectListFromArray(int[] IDs) { //Your help need is here. } } public class Doors : GenericAccess<DoorEntity> { } pu

我有一个其他类继承的抽象类

public abstract class GenericAccess<TEntity>
{
    public static IList<TEntity> GetObjectListFromArray(int[] IDs)
    {
        //Your help need is here.
    }
}

public class Doors : GenericAccess<DoorEntity>
{

}

public class DoorEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}
例如,我需要创建一个泛型方法,以便能够

IList<DoorEntity> Doors.GetObjectListFromArray(int[] {1,2,3,4,5});

它将返回一个IList,其中所有对象的属性Id都加载了传递的值。在上面的示例中,它将返回一个列表,列表中有5项,其中加载了DoorEntity的Id。

我不确定这是否是您想要的,但下面是:

return from int id in Ids
       select new TEntity (id);
您必须更正GenericAccess类的定义,以向泛型参数添加约束,如下所示:

public abstract class GenericAccess<TEntity> where TEntity : class, new

使用接口或基类

带接口:

public abstract class GenericAccess<TEntity> where TEntity : IEntity, new()
{
    public static IList<TEntity> GetObjectListFromArray(int[] IDs)
    {
        return IDs.Select(id => new TEntity { Id = id }).ToList();
    }
}

public class Doors : GenericAccess<DoorEntity>
{

}

public class DoorEntity : IEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public interface IEntity
{
    int Id { get; set; }
    string Name { get; set; }
}
使用基类:

public abstract class GenericAccess<TEntity> where TEntity : Entity, new()
{
    public static IList<TEntity> GetObjectListFromArray(int[] IDs)
    {
        return IDs.Select(id => new TEntity { Id = id }).ToList();
    }
}

public class Doors : GenericAccess<DoorEntity>
{

}

public class DoorEntity : Entity
{

}

public abstract class Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

你的函数可以是这样的

public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
    var r = new List<TEntity>();
    foreach (var item in IDs)
    {
        var obj = typeof(TEntity).Assembly.CreateInstance(typeof(TEntity).FullName);
        var p = obj.GetType().GetProperty("Id", System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
        if (p != null)
        {
            p.SetValue(obj, item, null);
            var m = r.GetType().GetMethod("Add");
            m.Invoke(r, new object[] { obj });
        }
    }
    return r;
}
}


您可以使用字典来实现这一点。DoorEntity对象从何处具体化?它们是否存储在GenericAccess对象中的某个位置?它们是从数据库中提取的吗?DoorEntity是使用Nhibernate Fluent从数据库中加载的。请将您的示例放在答案中,而不是放在链接后面!太好了!太好了看到你的解决方案真的很有趣!谢谢我在答案中插入了我的示例,而不是要点链接,对此表示抱歉。
public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
    var r = new List<TEntity>();
    foreach (var item in IDs)
    {
        var obj = typeof(TEntity).Assembly.CreateInstance(typeof(TEntity).FullName);
        var p = obj.GetType().GetProperty("Id", System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
        if (p != null)
        {
            p.SetValue(obj, item, null);
            var m = r.GetType().GetMethod("Add");
            m.Invoke(r, new object[] { obj });
        }
    }
    return r;
}
    IList<DoorEntity> r = Doors.GetObjectListFromArray(new int[] {1,2,3,4,5});