对两个不同的派生 类 使用相同的变量 "if is Class" 条件
Use the Same variable for "if is Class" condition for two different derived Classes
我有一个基本接口:
public interface IKlarfDefect
{
int TEST { get; set; }
int DEFECTID { get; set; }
}
这两个是哪位父亲类:
public interface IKlarfDefect
{
int TEST { get; set; }
int DEFECTID { get; set; }
public List<RMTKlarfImageListInfo> KlarfImageList { get; set; } = new List<RMTKlarfImageListInfo>();
}
public class CIMKlarfDefect : IKlarfDefect
{
public int TEST { get; set; }
public int DEFECTID { get; set; }
public List<CIMKlarfImageListInfo> KlarfImageList { get; set; } = new List<CIMKlarfImageListInfo>();
}
我有一个函数遍历 IKlarfDefect 列表:
internal static string CreateDefectListString(IEnumerable<IKlarfDefect> klarfDefectList)
{
StringBuilder defectListString = new StringBuilder();
defectListString.AppendLine("");
foreach (var klarfDefect in klarfDefectList)
{
if ((klarfDefect is CIMKlarfDefect klarfDefectGeneric || klarfDefect is RMTKlarfDefect klarfDefectGeneric) )
{
if (klarfDefectGeneric.KlarfImageList.Count == 0)
{
defectListString.Append("N;");
defectListString.AppendLine();
}
}
}
}
但是 Visual studio 给我错误:
Severity Code Description Project File Line Suppression State
Error CS0128 A local variable or function named 'klarfDefectGeneric' is already defined in this scope
有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?
有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?
不,没有办法专门做到这一点。
但是您可以通过创建另一个界面来获得相同的功能:
public interface IHasKlarfImageList
{
List<Image> KlarfImageList{ get; }
}
然后继承你的两个特殊的接口类:
RMTKlarfDefect : IKlarfDefect, IHasKlarfImageList
现在您可以这样做了:
if ((klarfDefect is IHasKlarfImageList klarfDefectGeneric )
{
if (klarfDefectGeneric.KlarfImageList.Count == 0)
{
defectListString.Append("N;");
defectListString.AppendLine();
}
}
请注意,如果您发现自己在做类似 if obj is type TypeA do X, else if obj is TypeB do Y
的事情,您就违反了 Open-Closed 原则并且没有正确使用多态性。这些都是大词,但这些概念并不像听起来那么吓人。请理解这些概念,以免自己(以及与您一起工作的人)头疼。多态性首先是编写接口的全部目的。
我有一个基本接口:
public interface IKlarfDefect
{
int TEST { get; set; }
int DEFECTID { get; set; }
}
这两个是哪位父亲类:
public interface IKlarfDefect
{
int TEST { get; set; }
int DEFECTID { get; set; }
public List<RMTKlarfImageListInfo> KlarfImageList { get; set; } = new List<RMTKlarfImageListInfo>();
}
public class CIMKlarfDefect : IKlarfDefect
{
public int TEST { get; set; }
public int DEFECTID { get; set; }
public List<CIMKlarfImageListInfo> KlarfImageList { get; set; } = new List<CIMKlarfImageListInfo>();
}
我有一个函数遍历 IKlarfDefect 列表:
internal static string CreateDefectListString(IEnumerable<IKlarfDefect> klarfDefectList)
{
StringBuilder defectListString = new StringBuilder();
defectListString.AppendLine("");
foreach (var klarfDefect in klarfDefectList)
{
if ((klarfDefect is CIMKlarfDefect klarfDefectGeneric || klarfDefect is RMTKlarfDefect klarfDefectGeneric) )
{
if (klarfDefectGeneric.KlarfImageList.Count == 0)
{
defectListString.Append("N;");
defectListString.AppendLine();
}
}
}
}
但是 Visual studio 给我错误:
Severity Code Description Project File Line Suppression State
Error CS0128 A local variable or function named 'klarfDefectGeneric' is already defined in this scope
有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?
有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?
不,没有办法专门做到这一点。
但是您可以通过创建另一个界面来获得相同的功能:
public interface IHasKlarfImageList
{
List<Image> KlarfImageList{ get; }
}
然后继承你的两个特殊的接口类:
RMTKlarfDefect : IKlarfDefect, IHasKlarfImageList
现在您可以这样做了:
if ((klarfDefect is IHasKlarfImageList klarfDefectGeneric )
{
if (klarfDefectGeneric.KlarfImageList.Count == 0)
{
defectListString.Append("N;");
defectListString.AppendLine();
}
}
请注意,如果您发现自己在做类似 if obj is type TypeA do X, else if obj is TypeB do Y
的事情,您就违反了 Open-Closed 原则并且没有正确使用多态性。这些都是大词,但这些概念并不像听起来那么吓人。请理解这些概念,以免自己(以及与您一起工作的人)头疼。多态性首先是编写接口的全部目的。