2014-09-11 3 views
3

У меня есть требование динамически вызывать класс и использовать методы этого класса.Доступ к методу класса с использованием экземпляра другого класса?

public class A 
{ 
    public void test() 
    { 
    } 
} 

public Class B 
{ 
    public void test() 
    { 
    } 
} 
class object intermediate 
{ 
//here will decide which class to be invoked 
//return the invoked class instance 
} 

class clientclass 
{ 
intermedidate client=new intermediate(); 
} 

Так я могу получить доступ к методам вызванного класса, в случае клиента. Im using Framework 3.5. Если дочерний класс унаследован от промежуточного класса, можно ли это достичь? Я не хочу здесь размышлять.

+0

Вы можете использовать интерфейс в качестве родительского класса как '' Ā' и B' затем затем передать параметр типа родительского класса и вызова метод. –

+0

Можете ли вы привести пример? – 2014-09-11 12:11:34

+0

вы можете добавить некоторые методы в A и B, чтобы ваш пример был более ясным. –

ответ

0

Попробуйте

public interface IClassA 
{ 
    void Method(); 
} 

public class ClassA : IClassA 
{ 
    public void Method() 
    { 

    } 
} 

public static class ObjectInjector 
{ 
    public static T GetObject<T>() 
    { 
     object objReturn = null; 
     if(typeof(T) == typeof(IClassA)) 
     { 
      objReturn = new ClassA(); 
     } 
     return (T)objReturn; 
    }   
} 

public class ClientClass 
{ 
    static void Main(string[] args) 
    { 
      IClassA objA = ObjectInjector.GetObject<IClassA>(); 
      objA.Method(); 
    } 
} 
+0

Im получает ошибку в строке objA.Method(); – 2014-09-12 02:34:19

+0

какая ошибка у вас? –

+0

Ошибка \t \t 1 Недопустимый маркер «(» в классе, структуре или декларации элемента интерфейса \t в строке objA.Method() – 2014-09-12 10:12:32

4

Вы можете сделать, как следует (не проверено)

interface I 
{ 
} 
class A :I 
{ 
} 

Class B:I 
{ 
} 
class intermediate 
{ 
    public I GetInstance(int i) 
    { 
     if(i==1) 
      return new A(); 
     else 
      return new B(); 
    } 

} 
class clientclass 
{ 
     I client=new intermediate().GetInstance(1); 
} 
+0

как я могу отправить объект вместо возврата нового A() в этом? Является ли это возможным? Мне нужно отражение, чтобы создать там новый экземпляр. – 2014-09-12 01:06:16

+0

объект чего? 'return new A()' означает возврат объекта 'A' ​​и' return new B() 'означает экземпляр возврата' B'. –

0

Вы можете попробовать и сделать реализацию интерфейса как Şhȇkhaṝ имеет выше.

Вы также можете использовать абстрактный класс, если вам требуется начальная обработка перед вызовом метода класса A или B.

Вот пример консольного приложения, который демонстрирует это:

public abstract class MainClass 
{ 
    public virtual void test() 
    { 
     Console.WriteLine("This is the abstract class"); 
    } 
} 

public class A : MainClass 
{ 
    public override void test() 
    { 
     base.test(); 
     Console.WriteLine("Class A"); 
    } 
} 

public class B : MainClass 
{ 
    public override void test() 
    { 
     base.test(); 
     Console.WriteLine("Class B"); 
    } 
} 

public class Intermediate 
{ 
    public MainClass CreateInstance(string name) 
    { 
     if (name.ToUpper() == "A") 
     { 
      return new A(); 
     } 
     else 
     { 
      return new B(); 
     }; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Intermediate intermediate = new Intermediate(); 
     var client = intermediate.CreateInstance("B"); 

     client.test(); 
     Console.ReadLine(); 
    } 
} 
+0

Окей .. так что я переписать класс немного следующим образом 'общественного класса Intermediate { общественного MainClass CreateInstance (имя строки) { если (name.ToUpper() == "A") { вернуть новый A();. } еще { Тип type = name.GetType(); var obj = Activator.CreateInstance (type); return obj; }; } } ', но получение ошибки obj не может быть преобразовано в приложение.B. Какой-нибудь wrorkaround для этого? – 2014-09-11 22:03:26