私はこれが古い質問であることを知っていますが、クラスを名前空間として使用する非常に正当な理由(その時点で非静的なもの)は、C#がパラメトリックまたはジェネリック名前空間の定義をサポートしていないことです。http://tyreejackson.com/generics-net-part5-generic-namespaces/でこのトピックに関するブログ投稿を作成しました。
その要点は、ジェネリックを使用してボイラープレートコードの巨大な帯を抽象化する場合、関連するクラスとインターフェイス間で複数のジェネリックパラメーターを共有することが必要な場合があることです。これを行う従来の方法は、各インターフェイスおよびクラスシグネチャのジェネリックパラメーター、制約、およびすべてを再定義することです。時間が経つにつれて、パラメータと制約が急増し、1つの型から関連する型の型引数に型パラメータを転送することで、関連する型を常に修飾する必要があることは言うまでもありません。
外側のGenericクラスを使用し、関連する型をネストすると、コードを劇的に乾燥させ、抽象化を簡素化できます。次に、すべての具体的な詳細を提供する具体的な実装を使用して、パラメトリック名前空間クラスを導出できます。
簡単な例を次に示します。
public class Entity
<
TEntity,
TDataObject,
TDataObjectList,
TIBusiness,
TIDataAccess,
TIdKey
>
where TEntity : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>, subclassed
where TDataObject : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObject, subclassed
where TDataObjectList : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObjectList, subclassed
where TIBusiness : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseBusiness
where TIDataAccess : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseDataAccess
{
public class BaseDataObject
{
public TIdKey Id { get; set; }
}
public class BaseDataObjectList : Collection<TDataObject> {}
public interface IBaseBusiness
{
TDataObject LoadById(TIdKey id);
TDataObjectList LoadAll();
void Save(TDataObject item);
void Save(TDataObjectList items);
void DeleteById(TIdKey id);
bool Validate(TDataObject item);
bool Validate(TDataObjectList items);
}
public interface IBaseDataAccess
{
TDataObject LoadById(TIdKey id);
TDataObjectList LoadAll();
void Save(TDataObject item);
void Save(TDataObjectList items);
void DeleteById(TIdKey id);
}
}
このように使用します:
public class User
:
Entity
<
User,
User.DataObject,
User.DataObjectList,
User.IBusiness,
User.IDataAccess,
Guid
>
{
public class DataObject : BaseDataObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class DataObjectList : BaseDataObjectList {}
public interface IBusiness : IBaseBusiness
{
void DeactivateUserById(Guid id);
}
public interface IDataAcccess : IBaseDataAccess {}
}
次のような派生物を消費します。
public class EntityConsumer
{
private User.IBusiness userBusiness;
private Permission.IBusiness permissionBusiness;
public EntityConsumer(User.IBusiness userBusiness, Permission.IBusiness permissionBusiness) { /* assign dependencies */ }
public void ConsumeEntities()
{
var users = new User.DataObjectList();
var permissions = this.permissionBusiness.LoadAll();
users.Add
(new User.DataObject()
{
// Assign property values
});
this.userBusiness.Save(users);
}
}
このように型を記述することの利点は、型の安全性が向上し、抽象クラスでの型のキャストが少なくなることです。大規模な場合のArrayList
vs と同等ですList<T>
。