You can't restrict access on an instance by instance basis - the best you can do is to create an abstract base class which contains the common propteries, methods and so forth, and implement derived versions of that for each set of methods you want to have available.
public abstract class A {}
public class A1 : A
{
public void DoSomething(){}
}
public class A2 : A
{
public void DoSomethingElse(){}
}
...
A either = new A1();
A1 A1Only = new A1();
A2 A2Only = new A2();
either = A2Only;
A1Only.DoSomething();
A2Only.DoSomethingElse();
All of those are legal.
A1Only = A2Only;
A1Only.DoSomethingElse();
A2Only.DoSomething()
All of those will cause compilation errors.