嗨,继承失败后(它变得复杂),我偶然发现了泛型。我是一个编程新手,c#是我的第一门语言。
我有两个类CIMTDXInput, RMTTDXInput,它们具有相同的属性,但这些属性有稍微不同的成员。对于两者之间相同的3个属性,我只想检查它们是否为空。
所以我这样写:
public static TDX2KlarfResult CheckCIMTDXInput <T> (T input, TDX2KlarfResult result) where T: CIMTDXInput, RMTTDXInput
{
if (input.ToolContext == null)
{
Logger.Warn("Missing Tool Context Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Tool Context";
result.errorSubject = ErrorCategory.MISSING_TOOL_CONTEXT;
result.success = false;
return result;
}
if (input.SCContext == null)
{
Logger.Warn("Missing Context Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Context";
result.errorSubject = ErrorCategory.MISSING_CONTEXT;
result.success = false;
return result;
}
if (input.WaferContainer == null)
{
Logger.Warn("Missing Wafer Container Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Wafer Container";
result.errorSubject = ErrorCategory.MISSING_WAFER_CONTAINER;
result.success = false;
return result;
}
return result;
}
但是代码无法编译。我以为你可以分配多少门课给"t"?
这两个类都有ToolContext, SCContext和WaferContainer。与其为每一个都写一个函数,我认为为两个都写一个函数会更优雅。将来我还需要添加额外的输入,所以我不想每次都编写这个函数
原因
所以当你说:
public void MyMethod<T>(T value) where T: ClassA, ClassB
你说T应该同时由ClassA
和ClassB
导出。现在它将在这个场景中工作:
public class ClassA
{
public int SomeProperty { get; set; }
}
public class ClassB : ClassA
{
}
public class ClassC : ClassB
{
}
MyMethod<ClassB>(classBValue); // ClassB is a ClassB and is derived from ClassA
MyMethod<ClassC>(classCValue); // ClassC is derived from ClassB, and is indirectly derived from ClassA
但是这行不通:
public class ClassA
{
public int SomeProperty { get; set; }
}
public class ClassB
{
public int SomeProperty { get; set; }
}
因为它需要一个像这样的ClassC:
public class ClassC : ClassA, ClassB
{
}
这可能会导致编译时错误,因为c#不支持多重继承。也就是说,虽然你可以从另一个类派生出来的类派生出一个类,但你不能创建一个直接从两个类派生出来的类。
<标题>的解决方案你能做的就是声明一个接口:
public interface ISomeInterface
{
int SomeProperty { get; set; }
}
并让两个类都实现它:
public class ClassA : ISomeInterface
{
public int SomeProperty { get; set; }
}
public class ClassB : ISomeInterface
{
public int SomeProperty { get; set; }
}
如果我们改变方法签名,要求类实现我们的接口:
public void MyMethod<T>(T value) where T: ISomeInterface
然后在方法中我们可以访问T
的SomeProperty
属性:
public void MyMethod<T>(T value) where T: ISomeInterface
{
value.SomeProperty *= 2;
}
上网试试
标题>你需要使用一个接口
public interface IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}
}
public class CIMTDXInput:IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}
.... another properties
}
public class RMTTDXInput:IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}
.... another properties
}
,你的方法应该是
public static TDX2KlarfResult CheckCIMTDXInput<T>(T input, TDX2KlarfResult result) where T : IInput
或者你可以不使用泛型在这种情况下,就足够了
public static TDX2KlarfResult CheckCIMTDXInput(IInput input, TDX2KlarfResult result)