告诉C#该变量具有接口的属性

时间:2015-03-05 02:40:48

标签: c# types interface

我有以下界面:

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属性可以设置?

4 个答案:

答案 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) } xX类型为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,那么使用强制转换,如果它违反了该规则,将导致异常。

更新:最近我使用了一些MaybeAspublic 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}}