我不确定如何实现这个特定的想法我有一个类让我们称之为EnhancedUserInput,它将包含一些所有输入类型将具有的变量和一个特定的子类,这取决于操作期间的需要所以一些额外的变量和一个列表,例如它的子类将是MultipleChoice,它将具有MinSelection,MaxSelection和一个名为option的类型列表及其自己的变量ect,然后是另一个可能的子类,名为ExplicitAgreement,它具有变量inputLabel1,inputLabel2和BinaryInput类型的列表,它有自己的变量。
到目前为止,据我所知,最好的方法是使用某种类型的通用变量?我将展示一些代码来尝试并帮助获得我需要的东西,但只是想知道是否有一种简单的方法可以做到这一点我不知道?
public class EnhancedCustomerInput
{
public string Title { get; set;}
public bool ResponseOptional { get; set;}
public string CancelLabel { get; set;}
public string SubmitLabel { get; set}
// this is where I am unsure of how to go about it
public object inputType
{
MultipleChoice
ExplicitAgreement
}
}
public class MultipleChoice
{
public List<MultipleChoiceOption> Options { get; set; }
public int MinSelected { get; set; }
public int MaxSelected { get; set; }
}
public class ExplicitAgreement
{
public List<BinaryInputOption> Buttons { get; set; }
public string InputLabel1 { get; set; }
public string InputLabel2 { get; set; }
}
这个解决方案的最佳途径是什么?我可以想到一些可能的方法,但它们会有点无形,并且想知道是否有任何简单的方法?
答案 0 :(得分:4)
对我来说,你可能有错误的方法。也许你想要的只是使用类继承?
public class EnhancedCustomerInput
{
public string Title { get; set;}
public bool ResponseOptional { get; set;}
public string CancelLabel { get; set;}
public string SubmitLabel { get; set}
}
public class MultipleChoice : EnhancedCustomerInput
{
public List<MultipleChoiceOption> Options { get; set; }
public int MinSelected { get; set; }
public int MaxSelected { get; set; }
}
public class ExplicitAgreement : EnhancedCustomerInput
{
public List<BinaryInputOption> Buttons { get; set; }
public string InputLabel1 { get; set; }
public string InputLabel2 { get; set; }
}
答案 1 :(得分:2)
史蒂夫哈里斯的遗产建议很好。您使用Composition的原始选项也可以正常工作:
public class EnhancedCustomerInput
{
public string Title { get; set;}
public bool ResponseOptional { get; set;}
public string CancelLabel { get; set;}
public string SubmitLabel { get; set; }
public object InputData { get; set; }
}
唯一的问题是代码的消费者需要知道InputData
可以是几种不同类型之一,并且您可能需要switch
类型的逻辑。您可以向属性添加注释以向人们提供提示,或者您可以使用像LanguageExt这样的库,它提供Either
类型:
public class EnhancedCustomerInput
{
public string Title { get; set;}
public bool ResponseOptional { get; set;}
public string CancelLabel { get; set;}
public string SubmitLabel { get; set; }
public Either<MultipleChoice, ExplicitAgreement> InputData { get; set; }
}
这使得InputData
类型更加明显,但如果你有两种以上的可能性,它会变得非常笨拙。
您还可以声明InputData
必须实现的接口,这将使开发人员更容易找到所有要在那里使用的类型。但是一个空接口被认为是一种代码味道,因为它表明你正在使用接口来实现它们并不是真正的用途。
我发现效果良好的另一个选项是定义enum
类型,以帮助识别您可以拥有哪些不同类型的输入数据:
public class EnhancedCustomerInput
{
public string Title { get; set;}
public bool ResponseOptional { get; set;}
public string CancelLabel { get; set;}
public string SubmitLabel { get; set; }
public InputType InputType { get; set; }
public object InputData { get; set; }
}
public enum InputType { MultipleChoice, ExplicitAgreement }
这为您的业务逻辑提供了一组特定的可能类型,您可以switch
使用您的逻辑,并且在类序列化和反序列化时特别有效,因为这样您就可以告诉解串器哪个具体要将InputData
反序列化为。
有很多选择,每种选择各有利弊。