我有一个我定义的公共类,它最终将成为API的一部分,因此它必须具有某些公共属性.但是,我还希望某些属性是只读的,除非它们是在我自己的项目中创建的(例如,如果用户有我们的API,他们可以创建一个User对象,但是他们无法写入其ID字段,仅当我们从数据库中提取时才会填写).
我的想法是使用相同的命名空间,即"公共"DLL和"私有"DLL,有两个独立的程序集.公共DLL中的原型将如下所示:
namespace CompanyName
{
public partial class User
{
public Id { get; }
public Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
并且私有DLL将具有:
namespace CompanyName
{
public partial class User
{
public Id { set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这会有用吗?如果没有,有什么更好的方法呢?
长话短说:
是否有某种方法可以将抽象方法添加到基类中,从而允许派生类覆盖该方法的返回类型,而无需使用泛型,并且无需使用关键字
new?
我正在为 LLBLGen Pro 开发一些自定义模板。在此过程中,我拒绝更改 LLBLGen Pro 提供的默认模板,这样如果其他人选择实施我的模板,我的方法就不会覆盖他们的文件。
我开始处理(并取得了良好进展)的一项任务是开发一个为每个实体生成 DTO 的模板。沿着这些思路,一个目标是为我的实体提供一种ToDTO()方法。为了进行泛型编程,我决定在公共基类中定义此方法,这就是我的麻烦开始的地方。
请记住,ToDTO()在基类中定义方法的目的是因为我希望创建一个通用存储库(Fetch()例如,使用方法),我希望在该存储库中工作CommonEntityBase,而不是特定实体。
LLBLGen 定义其CommonEntityBase类如下:
public abstract partial class CommonEntityBase : EntityBase2 {
// LLBLGen-generated code
}
Run Code Online (Sandbox Code Playgroud)
我最初的计划是将我的方法添加到另一个部分类中,如下所示:
public abstract partial class CommonEntityBase {
public abstract CommonDTOBase ToDto();
}
Run Code Online (Sandbox Code Playgroud)
我认为继承的类能够将其方法中的返回类型定义为从基类的返回类型派生的类型,如下所示:
public partial class PersonEntity : CommonEntityBase {
public override PersonDTO ToDto(){ return new PersonDTO(); }
}
Run Code Online (Sandbox Code Playgroud)
但是我错了。
我的第二次尝试是使用泛型定义类,如下所示:
public abstract partial class CommonEntityBase<T> : CommonEntityBase
where …Run Code Online (Sandbox Code Playgroud) 我有一个名为的抽象类PersonAbstract.它有一个名为的抽象属性Age
abstract public int Age { get; set; }
Run Code Online (Sandbox Code Playgroud)
两个类调用Customer并Employee扩展PersonAbstract.
Customer并Employee使用Linq-to-SQL创建,因此它们具有自动生成的代码.
这两个的自动生成代码:
public int Age
{
get
{
return this._age;
}
set
{
this._age = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我向部分类添加功能Employee并Customer使用它.
public partial class Employee: PersonAbstract
{
.....
Run Code Online (Sandbox Code Playgroud)
如何更改此结构,以便继承的类(Employee和Customer)使其person属性覆盖抽象类中的person属性而不触及自动生成的代码?
编辑:
问题是我希望两个类共享一些父类的代码.所以我一直在尝试在实现具有Age属性的接口和两个子类之间添加带有共享代码的抽象类.但该代码需要访问该Age属性.因此抽象类必须使用Age属性的抽象实例来实现接口,子类重写它.如果这不可能,我怎样才能达到预期的效果呢?
除了有100个成员的类的非典型原因(例如DAO模式访问数百个对象),最好的方法是什么:只有一个类包含所有成员,或者只有一百个部分类,每个都有一个成员?
每个成员的一个部分类看起来不错,因为它有助于构建插入和删除成员的自动化解决方案,只需创建或删除文件(类).
C#或.Net中的某些内容是否限制了部分类的数量?那么在设计时或编译中其他人的表现或资源消耗怎么样,假设在运行时这两个选择是相同的?
详细说明示例:需要从DaoFactory(DAO模式)访问的具有数百个对象的数据库通常对数据库中的每个对象都有一个成员.我们不讨论背后的业务,为什么这个系统有它以及它如何工作,但我们有一个情况,所有对象都需要被DaoFactory"暴露".当然,对对象进行分组的多个DaoFactories可以最小化其大小(成员数量),但只有当分部考虑它们之间的所有可能关系时,所以所有可能的数据库事务组合在它们之间以对它们进行分组.
所以,假设我们不能划分这个DaoFactory,我们有一个包含数百个成员的类,而部分类是我所要求的替代类,有一种工具可以维护它只是为每个成员创建或删除部分类.
我添加了两个具有相同名称的部分类:
public partial class SomePartial
{
}
Run Code Online (Sandbox Code Playgroud)
现在我有两个单独的文件.
我想让它们在项目中显示为单个项目,可以在WebForms项目中进行扩展,您可以在其中拥有Form.cs和拥有Form.Designer.cs.
我有一个继承自抽象类的基类,但它本身必须声明为partial,因为我正在使用源生成器来生成部分实现。
如何防止partial class在 C# 中实例化它?有没有办法在编译时做到这一点?
编辑:我将 C# 8.0 (.NET Standard 2.1) 与 Xamarin.Forms 项目一起使用。
我试过了partial abstract,但是这是不允许的。
在我的一个项目中,我一直使用一个abstract class作为ViewModel 的基类来实现MVVM 模式。以前,所述基类实现了该INotifyPropertyChanged接口,但现在我切换到CommunityToolkit.Mvvm,以便能够使用MVVM 源生成器 (我已经在其他项目中广泛使用了它,我什至写了一个关于它们的博客系列) 。
显然,在 C# 中,一个类只能是其中之一partial,abstract但不能同时是两者,这是有道理的。由于源生成器仅与类一起使用partial,因此我的基类不能abstract再这样了。但是,这会产生一个问题,即我无法阻止基类在编译时实例化。虽然它仍然是一个abstract class,但无法实例化,但现在可以这样做。
这就是基类过去的样子(简化/修改的示例):
public abstract class ViewModelBase : INotifyPropertyChanged
{
private bool _myBool;
public …Run Code Online (Sandbox Code Playgroud)