2012-12-12 67 views
2

ActionBase,ActionA,ActionB和ActionC是實體(來自數據庫)。 ActionA,ActionB和ActionC是派生類型的ActionBase。通過接口轉換訪問屬性

ActionB和ActionC使用SpecialProperty實現ISpecialAction。

例如:

public interface ISpecialAction 
{ 
    Guid SpecialProperty { get; } 
} 

public partial class ActionBase 
{ 
    public objectX OnePropertyBase { get; set; } 
} 

public partial class ActionA : ActionBase 
{ 
    public objectY OnePropertyA { get; set; } 
} 

public partial class ActionB:ActionBase,ISpecialAction 
{ 
    public objectZ OnePropertyB { get; set; } 

    public Guid SpecialProperty 
    { 
     get 
     { 
      return OnePropertyB.ID; 
     } 
    } 
} 

public partial class ActionC : ActionBase ,ISpecialAction 
{ 
    public objectW OnePropertyC { get; set; } 

    public Guid SpecialProperty 
    { 
     get 
     { 
      return OnePropertyC.ID; 
     } 
    } 
} 

我的問題是SpecialProperty從對象(ActionB或ActionC),當演員(以ISpecialAction)完成,OtherProperty和OtherProperty2是空的其他屬性建立。 我想:

GetActionBase().ToList().Where(x=>x is ISpecialAction && ((dynamic) x).SpecialProperty== p_SpecialProperty); 
GetActionBase().ToList().Where(x=>x is ISpecialAction && ((ISpecialAction) x).SpecialProperty== p_SpecialProperty); 
GetActionBase().ToList().OfType<ISpecialAction>().Where(x => x.SpecialProperty== p_SpecialProperty).Cast<ActionBase>(); 
return GetActionOnGoing().ToList().OfType<ICityAction>().Cast<ActionBase>().Where(x => ((dynamic)x).CityId == p_CityId); 

備註:OfType<>不與LINQ到實體的接口工作,但是確定在LINQ to對象

如何訪問我的財產接口,無需知道對象的類型?

+0

我假定你的意思'OnePropertyA'和'OnePropertyB'在'OtherProperty'和'OtherProperty2'代替?那'OnePropertyA'和'OnePropertyB'是映射的屬性? –

回答

0

我可能錯過了一些東西,但是這是可以根據您提供的代碼:

public class objectX 
{ 

} 
public class objectY 
{ 

} 
public class objectZ 
{ 
    public Guid ID { get { return Guid.NewGuid();} } 
} 
public class objectW 
{ 
    public Guid ID { get { return new Guid(); } } 
} 

class Program 
{ 
    private static Guid p_SpecialProperty; 
    static void Main(string[] args) 
    { 
     var result = GetActionBase().ToList().Where(x => x is ISpecialAction && ((dynamic)x).SpecialProperty == p_SpecialProperty).FirstOrDefault(); 
     var result1 = GetActionBase().ToList().Where(x => x is ISpecialAction && ((ISpecialAction)x).SpecialProperty == p_SpecialProperty).FirstOrDefault(); 
     var result2 = GetActionBase().ToList().OfType<ISpecialAction>().Where(x => x.SpecialProperty == p_SpecialProperty).Cast<ActionBase>().FirstOrDefault(); 
       } 

    private static IEnumerable<ActionBase> GetActionBase() 
    { 
     return new List<ActionBase> {new ActionA{OnePropertyA= new objectY()}, new ActionB{OnePropertyB=new objectZ()},new ActionC{OnePropertyC=new objectW()} }; 
    } 
} 
0

不知道我究竟明白你的問題,但可以嘗試使用中間的接口,如:

public interface ISpecialActionB : ISpecialAction 
{ 
    objectZ OnePropertyB { get; set; } 
} 

public class ActionB : ActionBase, ISpecialActionB 
{ 
    //same stuff 
} 

,鑄造到代替。

var b = new ActionB{OnePropertyB = new Whatever()}; 

var bAsSpecial = b as ISpecialActionB; 

var whatever = b.OnePropertyB; // should not be null 
0

這是好的。

您的示例運行良好,沒有問題,因此我以其他方式搜索:AutoMapper。

l_List.Actions = Mapper.Map<List<ActionBase>, Action[]>(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList()); 

問題不是接口或LINQ查詢,但它是automapper需要一個空的構造和在此構造方法,我需要初始化OnePropertyB和OnePropertyC計算SpecialProperty。

感謝