访问具有接口强制转换的属性

时间:2012-12-12 12:36:17

标签: linq entity-framework interface

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为null。 我试过了:

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中可以使用

如何在不知道对象类型的情况下访问我的属性界面?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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()} };
    }
}

答案 2 :(得分:0)

没关系。

您的示例运行良好而没有问题所以我以其他方式搜索:AutoMapper。

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

问题不是接口或Linq查询,而是autpper需要一个空构造函数,在这个构造函数中,我需要初始化OnePropertyB和OnePropertyC来计算SpecialProperty。

由于