我对异步/等待是完全陌生的,并且一直在“改进”我两年前编写的完全同步的应用程序。我有以下情况,我对解决方案不满意。
XAML绑定到以下两个类:
XAML
private InsuranceEditor _primaryinsurance;
public InsuranceEditor PrimaryInsurance
{
get { return _primaryinsurance; }
set { if (_primaryinsurance == value) return; _primaryinsurance = value; OnPropertyChanged("PrimaryInsurance"); }
}
private InsuranceEditor _secondaryinsurance;
public InsuranceEditor SecondaryInsurance
{
get { return _secondaryinsurance; }
set { if (_secondaryinsurance == value) return; _secondaryinsurance = value; OnPropertyChanged("SecondaryInsurance"); }
}
类PrimaryInsurance和SecondaryInsurance继承于抽象类Insurance:
abstract class InsuranceEditor : SimpleViewModelBase, ISave, IDataErrorInfo
{
.................
// Constructor
public InsuranceEditor(PatientDemographicsEditor patient, Billing service)
{
...
}
用于异步构造PrimaryInsurance(Async OOP Constructor)
private async Task<PrimaryInsurance> InitializeAsync()
{
// asyncData = await GetDataAsync();
return this;
}
public static Task<PrimaryInsurance> Create(PatientDemographicsEditor patient, Billing service)
{
var ret = new PrimaryInsurance(patient, service);
return ret.InitializeAsync();
}
// Constructor
private PrimaryInsurance(PatientDemographicsEditor patient, Billing service)
: base(patient, service)
{
Editor_Id = 1;
........
}
class SecondaryInsurance : InsuranceEditor
{
// Constructor
private SecondaryInsurance(PatientDemographicsEditor patient, Billing service)
: base(patient, service)
{
Editor_Id = 2;
............................
}
}
从逻辑上讲,一级和二级保险的唯一区别在于
Editor_Id
,因此从通用的InsuranceEditor
继承似乎很自然。现在,问题出在“正确”对主要和次要保险应用异步/等待。我希望用法是这样的:PrimaryInsurance = await PrimaryInsurance.Create(....)
其中,Create(...)
被识别为PrimaryInsurance
的静态方法(不一定是抽象类InsuranceEditor
的静态方法。)能做到吗?
编辑#1。发布此问题后,我想它可能已经被问过了,What's the correct alternative to static method inheritance?,而我想要的内容无法用C#完成。它是否正确?
编辑#2:我在VS中遇到的问题与用法语句一起出现:
PrimaryInsurance =等待PrimaryInsurance.Create(Patient,BILLING);
VS告诉我:
成员'InsuranceEditor.Create(PatientDemographicsEditor,Billing)'
不能使用实例引用进行访问;用类型限定它
取而代之
然后,如果我允许VS创建Create(...)(以便没有错误),它将在abstact InsuranceEditor类而不是PrimaryInsurance类中进行创建。
internal Task<InsuranceEditor> Create(PatientDemographicsEditor patient, Billing bILLING)
{
throw new NotImplementedException();
}
我究竟做错了什么?
最佳答案
您仍然没有提供可靠的Minimal, Complete, and Verifiable code example来可靠地重现该问题。但是根据示例程序语句和引用的错误消息,您似乎正在尝试在与属性名称不明确的上下文中使用PrimaryInsurance
标识符。
如果要保留属性的名称,则在任何要使用类型名称的位置,都需要完全限定其名称。例如:
PrimaryInsurance = await MyNamespace.PrimaryInsurance.Create(Patient, BILLING);
其中
MyNamespace
是该类型的实际名称空间。如果名称空间特别长,或者出于任何其他原因,您不想每次都键入整个内容,则可以使用
using
指令为类型名称加上别名。例如:using PrimaryInsuranceType = MyNamespace.PrimaryInsurance;
然后,您的程序语句可能如下所示:
PrimaryInsurance = await PrimaryInsuranceType.Create(Patient, BILLING);
当然,
PrimaryInsuranceType
只是一个例子。您可以使用所需的任何类型别名,只要它与属性名称本身(或类中的任何其他属性名称)不同即可。