我有以下界面:
public interface ISoftDeletable
{
bool IsDeleted { get; set; }
}
我的实体:
public class Field : ISoftDeletable
{
[Key]
public int FieldID { get; set; }
public bool IsDeleted { get; set; }
...
在我的通用存储库中,我有:
...
if( entity is ISoftDeletable )
{
entity.IsDeleted = true; // does not know entity is implementing ISoftDeletable, so is throwing error that i cannot set IsDeleted
}
...
但当然,c#并不知道实体正在实现ISoftDeletable,因为实体是泛型类型。
如何让C#知道IsDeleted属性可以设置?
答案 0 :(得分:6)
根据您的代码,我稍微将其更改为:
var softDelete = entity as ISoftDeletable;
if(softDelete != null)
{
softDelete .IsDeleted = true;
}
这段代码对于它实际做的事情(IMO)更具可读性。
答案 1 :(得分:5)
我对你的设置知之甚少,而不是你提供的内容;但这对我来说很可疑。它可能不是,但我没有足够的图片知道。
要解决您的直接问题,您可以将entity
转换为ISoftDeletable
,以便设置ISDeleted
属性:
((ISoftDeletable)entity).IsDeleted = true;
再次;关于不得不这样做的事情;但现在是晚上9点47分,所以今晚我不会花太多脑力来解决这个问题。
答案 2 :(得分:4)
据我所知,C#类型系统不理解if (x is X) { (1) }
x
中X
类型为X
或(1)
中的子类型为if (entity is ISoftDeletable) {
((ISoftDeletable)entity).IsDeleted = true;
}
。这在C#中甚至可能不是一个安全的假设,我不知道(并发?)。
相反,你可以写这个。
entity
这会导致IsDeleted
两次投射,一次用于分支条件,再次设置var deletableEntity = entity as ISoftDeletable;
if (deletableEntity != null) {
deletableEntity.IsDeleted = true;
}
,这是一个不幸的后果。铸造的成本可能是非常重要的(我会让你决定你的情况)。这是另一种不能做到这一点的变体。
{{1}}
答案 3 :(得分:3)
您可以使用as
:
var maybeSoftDeletable = entity as ISoftDeletable;
if (maybeSoftDeletable != null)
maybeSoftDeletable.IsDeleted = true;
如果maybeSoftDeletable
不是null
,则 entity
将为ISoftDeletable
,否则将ISoftDeletable
为同一对象的var definitelyASoftDeletable = (ISoftDeletable)entity;
definitelyASoftDeletable.IsDeleted = true;
引用。
根据乔治的回答,你也可以施展:
entity
主要区别在于您是否知道entity
属于哪种类型。如果允许as
为1,则使用entity
。如果Maybe
应该是1,那么使用强制转换,如果它违反了该规则,将导致异常。
更新:最近我使用了一些MaybeAs
和public static void MaybeAs<T>(
this object pObject,
Action<T> pAction
) {
var maybeT = pObject as T;
if (maybeT == null)
return;
var t = maybeT;
pAction(t);
}
// and one for functions
public static TResult MaybeAs<TObject, TResult>(
this object pObject,
Func<TObject, TResult> pFunc
) where TObject : class
where TResult: class {
var maybeT = pObject as TObject;
if (maybeT == null)
return null;
var t = maybeT;
return pFunc(t);
}
// to allow for primitive return values
public static TResult MaybeAs<TObject, TResult>(
this object pObject,
Func<TObject, TResult> pFunc,
TResult pValueWhenNot
) where TObject : class {
var maybeT = pObject as TObject;
if (maybeT == null)
return pValueWhenNot;
var t = maybeT;
return pFunc(t);
}
扩展方法,到目前为止我很喜欢这些方法:
entity.MaybeAs<ISoftDeletable>(softDeletable => softDeletable.IsDeleted = true);
用过:
{{1}}