Linq 使用接口强制转换访问属性
ActionBase、ActionA、ActionB和ActionC是实体(来自数据库)。ActionA、ActionB和ActionC是ActionBase的派生类型 ActionB和ActionC使用SpecialProperty实现isSpecialAction 例: 我的问题是SpecialProperty是从对象的其他属性(ActionB或ActionC)构建的,当转换(到IsSpecialAction)完成时,OtherProperty和OtherProperty2为空。 我试过:Linq 使用接口强制转换访问属性,linq,entity-framework,interface,Linq,Entity Framework,Interface,ActionBase、ActionA、ActionB和ActionC是实体(来自数据库)。ActionA、ActionB和ActionC是ActionBase的派生类型 ActionB和ActionC使用SpecialProperty实现isSpecialAction 例: 我的问题是SpecialProperty是从对象的其他属性(ActionB或ActionC)构建的,当转换(到IsSpecialAction)完成时,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);
GetActionBase().ToList()。其中(x=>x是isSpecialAction&((动态)x)。SpecialProperty==p_SpecialProperty);
GetActionBase().ToList()。其中(x=>x是isSpecialAction&((isSpecialAction)x)。SpecialProperty==p_SpecialProperty);
GetActionBase().ToList().OfType()。其中(x=>x.SpecialProperty==p_SpecialProperty).Cast();
返回getActionContinuous().ToList().OfType().Cast().Where(x=>((动态)x).CityId==p_CityId);
备注:类型的不适用于LINQtoEntities中的接口,但在LINQtoObject中可以
如何在不知道对象类型的情况下访问属性接口?我不确定是否完全理解您的问题,但您能否尝试使用中间接口,例如:
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
我可能遗漏了一些内容,但您提供的代码没有问题:
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()} };
}
}
公共类objectX
{
}
公共类反对
{
}
公共类对象
{
公共Guid ID{get{return Guid.NewGuid();}}
}
公共类对象
{
公共Guid ID{get{返回新Guid();}}
}
班级计划
{
专用静态Guid p_专用属性;
静态void Main(字符串[]参数)
{
var result=GetActionBase().ToList()。其中(x=>x是isSpecialAction&((动态)x)。SpecialProperty==p_SpecialProperty)。FirstOrDefault();
var result1=GetActionBase().ToList()。其中(x=>x是isSpecialAction&((isSpecialAction)x)。SpecialProperty==p_SpecialProperty)。FirstOrDefault();
var result2=GetActionBase().ToList().OfType().Where(x=>x.SpecialProperty==p_SpecialProperty).Cast().FirstOrDefault();
}
私有静态IEnumerable GetActionBase()
{
返回新列表{new ActionA{OnePropertyA=new objectY()},新ActionB{OnePropertyB=new objectZ()},新ActionC{OnePropertyC=new objectW()};
}
}
没问题
您的示例运行得很好,没有问题,所以我用另一种方式搜索:AutoMapper
l_List.Actions = Mapper.Map<List<ActionBase>, Action[]>(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());
l_List.Actions=Mapper.Map(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());
问题不是接口或Linq查询,而是automapper需要一个空构造函数,在这个构造函数中,我需要初始化OnePropertyB和OnePropertyC来计算SpecialProperty
谢谢我想你是指OnePropertyA
和OnePropertyB
而不是OtherProperty
和OtherProperty2
?而OnePropertyA
和OnePropertyB
是映射属性吗?
l_List.Actions = Mapper.Map<List<ActionBase>, Action[]>(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());