Note that there are some explanatory texts on larger screens.

plurals
  1. POC# Access to a generic class member whose type is a generic argument type, only via an interface
    text
    copied!<p>I have a generic class who holds a member whose type is an argument type.<br> I want to be able to access this member only by one of the interface it implements.<br> The reason I want to access the member only via this interface, instead of enumerating all the concrete types it could be, is because there are a great number of those types. </p> <p>So concretely I want to find an equivalent of line 61 in that code (it is a compilation error):</p> <pre><code>using System; using System.Linq; /* Interfaces */ public interface IArgumentClass { void IArgumentClassMethod(); } public interface ISpecialArgumentClass { void ISpecialArgumentClassMethod(); } public interface IContainerClass { void IContainerClassClassMethod(); } /* Argument types */ public class ArgumentClass0 : IArgumentClass { public void IArgumentClassMethod(){} } public class SpecialArgumentClass0 : IArgumentClass, ISpecialArgumentClass { public void IArgumentClassMethod(){} public void ISpecialArgumentClassMethod(){} } public class SpecialArgumentClass1 : IArgumentClass, ISpecialArgumentClass { public void IArgumentClassMethod() { } public void ISpecialArgumentClassMethod() { } } /* Container types */ public class GenericContainer&lt;T&gt; : IContainerClass where T : IArgumentClass, new() { public T t = new T(); public void IContainerClassClassMethod() { } } public class NonGenericContainer : IContainerClass { public void IContainerClassClassMethod(){} } /* main program */ public class Test { public static void Main() { // Instantiate IContainerClass[] containers = { new GenericContainer&lt;ArgumentClass0&gt;(), new GenericContainer&lt;SpecialArgumentClass0&gt;(), new GenericContainer&lt;SpecialArgumentClass1&gt;(), new NonGenericContainer() }; // We want to call IContainerClassClassMethod methods on all instances: foreach (IContainerClass container in containers) container.IContainerClassClassMethod(); // We want to call ISpecialArgumentClassMethod on instances where it's possible: foreach (IContainerClass container in containers) { if (container.GetType().IsGenericType &amp;&amp; container.GetType().GetGenericTypeDefinition() == typeof(GenericContainer&lt;&gt;)) { foreach (Type typeArgument in container.GetType().GetGenericArguments()) { if (typeArgument.GetInterfaces().Contains(typeof(ISpecialArgumentClass))) { // Next line is a compilation error. How can I get a similar result? GenericContainer&lt;ISpecialArgumentClass&gt; mySpecializedClassWithSpecialArgument = container as GenericContainer&lt;ISpecialArgumentClass&gt;; mySpecializedClassWithSpecialArgument.t.ISpecialArgumentClassMethod(); } } } } } } </code></pre> <p><em>Note: You can fork and edit the code <a href="http://ideone.com/kUnIqp" rel="nofollow">here</a>.</em></p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload