2011-06-01 57 views
4

我有一個抽象類,其他類正在繼承此類。在C中使用抽象類#

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

將返回其在它的屬性Id裝載值傳遞的所有對象一個IList。在上面的例子中,它將返回一個列表,列表中有5個項目,加載了DoorEntity的Id。

+0

你可以使用字典做到這一點。 – Firoso 2011-06-01 19:01:03

+1

DoorEntity對象在哪裏實現?它們是否存儲在GenericAccess對象的某個地方?他們是從數據庫中拉出來的嗎? – Tim 2011-06-01 19:06:20

+0

使用Nhibernate Fluent從數據庫加載DoorEntity。 – 2011-06-01 19:07:46

回答

2

使用一個接口或基類...

隨着接口:

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

請把你的例子放在答案中,而不是鏈接後面! – 2011-06-01 19:18:08

+0

這很棒!完善! - 真的很有趣看到你的解決方案! – 2011-06-01 19:23:01

+0

謝謝。我已將我的示例插入答案中,而不是Gist鏈接,對此抱歉。 – 2011-06-01 19:28:26

1

我不知道如果這就是你想要什麼,但這裏有雲:

return from int id in Ids 
     select new TEntity (id); 

你必須糾正GenericAccess類的定義來約束添加到泛型參數如下:

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

好,根據你的意見......

使用LINQ與NHibernate拿到實體的東西沿着線:

return from int id in Ids 
     select Session.Query (...).Where (x => x.Id === id); 
0

你的函數可以是這樣的

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