当前位置: 首页 > 编程语言 > C#

更新两个常用函数分享

时间:2023-04-10 13:39:42 C#

使用泛型更新两个常用函数使用泛型如果需要在另一个项目中测试非公共属性,使用微软单元测试向导创建一个Accessor对象。在我的单元测试中,我创建了辅助函数,这样我就不会在每个单元测试方法中重复相同的代码。目前我有两个几乎相同的测试,除了一个采用标准对象而另一个采用访问器版本。由于Accessor是基于标准版本的,我应该可以有一个功能,我认为我应该可以使用泛型来完成。问题是试图重新输入并且编译失败。以下是现有的两个函数://使用标准Account对象创建新测试记录的常用函数internalstaticvoidCreateAccount(outAccountaccount,boolsaveToDatabase){DateTimecreated=DateTime.Now;stringcreatedBy=_testUserName;帐户=新帐户(创建,创建者);account.Notes=Utilities.RandomString(1000);如果(saveToDatabase)account.Create();}//使用Account_Accessor创建新测试记录的常用函数internalstaticvoidCreateAccount(outAccount_Accessoraccount,boolsaveToDatabase){DateTimecreated=DateTime.Now;stringcreatedBy=_testUserName;account=newAccount_Accessor(已创建,已创建);account.Notes=Utilities.RandomString(1000);如果(saveToDatabase)account.Create();尝试将签名更改为组合函数:internalstaticvoidCreateAccount(outTaccount,boolsaveToDatabase){...}但这并没有正确地重新计算Account或Account_Accessor。有什么建议么?由于这两种方法,您应该为通用函数添加约束:account.Notes=Utilities.RandomString(1000);帐户.创建();我建议你用这两个方法添加一些接口,并将它的继承添加到你的两个类中。约束应如下:whereT:YourNewInterface关于约束,您可以在http://msdn.microsoft.com/en-us/library/bb384067.aspx上阅读UPDATEpublicinterfaceIAccount{stringNotes{get;放;无效创建();voidInit(DateTimecreated,stringcreatedBy);}publicclassAccount:IAccount{publicstringNotes{get{thrownewNotImplementedException();}设置{抛出新的NotImplementedException();}}publicvoidIAccount.Create(){thrownewNotImplementedException();}voidIAccount.Init(DateTimecreated,stringcreatedBy){thrownewNotImplementedException();}}publicclassAccount_Accessor:IAccount{stringIAccount.Notes{get{thrownewNotImplementedException();}设置{抛出新的NotImplementedException();}}publicvoidIAccount.Create(){thrownewNotImplementedException();}voidIAccount.Init(DateTimecreated,stringcreatedBy){thrownewNotImplementedException();}}classProgram{internalstaticvoidCreateAccount(outTaccount,boolsaveToDatabase)其中T:IAccount,new(){DateTimecreated=DateTime.Now;stringcreatedBy=_testUserName;账户=新T();account.Init(创建,创建);帐户=(T)Activator.CreateInstance(typeof(T),newobject[]{created,createdBy});account.Notes=Utilities.RandomString(1000);如果(saveToDatabase)account.Create();}staticvoidMain(string[]args){账户账户;Account_Accessoracc2;CreateAccount(outacc,false);CreateAccount(outacc2,false);以下是关于我的示例的一些评论:1.我通过添加new()约束来替换CreateInstance2.由于.NET泛型限制new()约束不能有参数,所以我在IAccount中添加了Init()方法界面。3.Init方法不应该被Account类的客户端代码调用,这就是我们将IAccount方法定义为private和explicit的原因。4.由于new()约束,您应该为Account提供无参数构造函数。如果这样做,您的客户端代码不应调用此无参数构造函数。至于我,我会保留Activator.CreateInstance原样。对于genericsnew()约束的局限性,这是一个很好的解决方法。这是我对该方法的通用性的看法。publicabstractclassBaseAccount{publicstringNotes;publicvirtualvoidCreate(){...}}publicclassAccount:BaseAccount{...}publicclassAccount_Accessor:BaseAccount{...}internalstaticvoidCreateAccount(outTaccount,boolsaveToDatabase)其中T:BaseAccount{DateTime创建=DateTime.Now;stringcreatedBy=_testUserName;帐户=(T)Activator.CreateInstance(typeof(T),newobject[]{created,createdBy});account.Notes=Utilities.RandomString(1000);如果(saveToDatabase)account.Create();我假设Account和Account_Accessor非常相似,它们要么共享相似的类层次结构,要么实现相同的接口。在这个例子中,我提供了一个抽象类,它们都从中派生,但很容易用接口替换它。但是,必须在两个类中完成完整的实现。知道这一点后,我可以约束泛型方法,使T只是BaseAccount的子代。这样,我就可以在不知道T的实际类型的情况下访问这个基类的成员了。以上是C#学习教程:更新两个常用函数,使用泛型共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: