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 中可以到对象

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

4

3 回答 3

0

没关系。

你的例子运行得很好,没有问题,所以我用另一种方式搜索:AutoMapper。

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

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

谢谢

于 2012-12-12T16:11:26.113 回答
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
于 2012-12-12T14:13:00.333 回答
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()} };
    }
}
于 2012-12-12T14:41:54.997 回答