c# - How can I make this generic interface more Typed? -



c# - How can I make this generic interface more Typed? -

consider class uses role objects, maintaining collection so. there may constraints on whether given role can added, action should take place if can added.

the irolespecication below designed separate responsibility add together decision , action away class maintaining collection, have working code (ie, useful) looks code sample below.

but create irolespecification.preinsert handler utilize generic type (trole) instead of object uses. tried adding parameter trole, existing code wanted remain covariant while method needed invariant.

how can that?

cheers, berryl

public interface irolespecification<in t> { bool canaddrolefor(t instance); /// <summary> /// called when newrole added instance's collection of roles. /// </summary> /// <param name="instance">the instance.</param> /// <param name="newrole">the new role.</param> void onpreinsert(t instance, object newrole); ... } public interface iemployeerolespecification<out trole> : irolespecification<employeeex> trole : employeerole { bool isjobrole { get; set; } } public abstract class employeerolespecification<trole> : valueobject, iemployeerolespecification<trole> trole : employeerole { public virtual bool canaddrolefor(employeeex employee) { homecoming false; } public virtual void onpreinsert(employeeex instance, object newrole) { // jobrole helps enforce role constraints // employee may have 1 job role 'job' role specs if (isjobrole) { instance.jobrole = (trole) newrole; } } .... } more code public class employeerole : employeeex { private static readonly iset<iemployeerolespecification<employeerole>> _creationspecs; static employeerole() { _creationspecs = new hashset<iemployeerolespecification<employeerole>> { new salesmanrolespecification(), new engineerrolespecification(), new managerrolespecification(), }; } } public class salesmanrolespecification : employeerolespecification<salesman> { public override bool canaddrolefor(employeeex employee) { homecoming _checkcanaddjobrole(employee); } public salesmanrolespecification() { isjobrole = true; } }

is there reason cannot declare iemployeerolespecification contravariant ?

given code posted, compile:

public interface iemployeerolespecification<in trole> : irolespecification<employeeex, employeerole> trole : employeerole { bool isjobrole { get; set; } } public abstract class employeerolespecification<trole> : iemployeerolespecification<trole> trole : employeerole { public virtual bool canaddrolefor(employeeex employee) { homecoming false; } public virtual void onpreinsert(employeeex instance, employeerole newrole) { // jobrole helps enforce role constraints // employee may have 1 job role 'job' role specs if (isjobrole) { instance.jobrole = newrole; } } public bool isjobrole { get;set; } } public class employeeex { public employeerole jobrole { get;set;} } public class employeerole { }

the reason why might not able this, if iemployeerolespecification includes fellow member (that omitted here), exposes trole (out-going) - because interface covariant. generic parameter cannot both co-and contravariant.

c# generics

Comments

Popular posts from this blog

iphone - Dismissing a UIAlertView -

intellij idea - Update external libraries with intelij and java -

javascript - send data from a new window to previous window in php -