2008-11-25 1 views
1

Я хочу передать в tType класса функцию, а объект класса - общей функции.Как я могу реализовать интерфейс для обработки классов литья классов?

Мне нужно, чтобы я мог использовать этот тип (класса), чтобы получить доступ к методам класса.

Что-то вроде:

void GenericFunction(Object obj, Type type) 
{ 
    (type)obj.someContainer.Add(1); 
} 

бы реализующий интерфейс для этих классов, а затем приведение к этому интерфейсу работы? Если да, может ли кто-нибудь привести пример?

Я уже несколько часов работаю в Google, и мне никогда не приходилось это делать раньше.

Может кто-то пролить свет?

ответ

3

Вот три способа, чтобы идти о том, что вы спрашиваете:

public interface ICanReport 
{ void Report(); } 

public class SomeThing : ICanReport 
{ 
    public void Report() 
    { Console.WriteLine("I'm SomeThing"); } 
} 

public class SomeOtherThing : ICanReport 
{ 
    public void Report() 
    { Console.WriteLine("I'm SomeOtherThing"); } 
} 

public class TestThings 
{ 
    //#1 use safe downcasting 
    public void TheMethod(object x) 
    { 
     ICanReport y = x as ICanReport; 
     if (y != null) 
      y.Report(); 
    } 

    //#2 use generics 
    // 100% safe, but a little complex 
    public void AnotherMethod<T>(T x) where T : ICanReport 
    { 
     x.Report(); 
    } 

    //#3 use an interface as the parameter type. 
    // simple and safe 
    public void LastMethod(ICanReport x) 
    { 
     x.Report(); 
    } 

    //sample calls 
    public void Test1() 
    { 
     SomeThing a = new SomeThing(); 
     SomeOtherThing b = new SomeOtherThing(); 
     TheMethod(a); 
     TheMethod(b); 
     AnotherMethod(a); 
     AnotherMethod(b); 
     LastMethod(a); 
     LastMethod(b); 
    } 
} 
0

Можете ли вы использовать дженерики в вызове метода? Что-то вроде:

void GenericFunction<T>(Object obj) 
    where T : class { 
    obj.someContainer.Add(1) as T; 
} 

Надеюсь, что это поможет!

+0

Не думаю, что вы могли бы назвать someContainer.Add() таким образом, так как тип неизвестен. Скорее всего, вам нужно будет вызвать этот метод, используя Reflection. – 2008-11-25 19:34:12

0

Что вы пытаетесь сделать, это динамическое приведение. Это не существует в C#.

Вы можете попробовать одно из следующих действий:

  • Объявить членов, которые вы хотите использовать в качестве базового класса или интерфейса и актеров к этому.
  • Используйте Дженерики, как в образце кода Zachary Yates:

    void GenericFunction<T>(Object obj) where T : class 
    { 
        obj.someContainer.Add(1) as T; 
    } 
    
0

ладно

class A { 
    public BindingList<int> addContainers; 
} 

class B { 
    public BindingList<int> addContainers; 
} 

class C { 
    Type type; 
    Object senderObj; 

    C(Object s, Type t) 
    { 
      senderObj = s; 
      type = t; 
    } 

    private void AddBtn_Click(click sender, EventArgs e) 
    { 
      // Depending on the Type passed to the constructor, i need to cast to that type 
      // so that i have access to the classes public addContainer member variable 
     } 
0

Попробуйте этот код. Замените Class2 на Class1 в своем списке, чтобы увидеть результаты.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ReflectionTest 
{ 
    class Class1 
    { 
     public void helloWorld() 
     { 
      Console.WriteLine("Hello World 1"); 
     } 
    } 

    class Class2 
    { 
     public void helloWorld() 
     { 
      Console.WriteLine("Hello World Class 2"); 
     } 
    } 

    class Program 
    { 
     static void callCorrectClass(Object obj, Type type) 
     { 
      ConstructorInfo constructors = type.GetConstructor(System.Type.EmptyTypes); 
      obj = constructors.Invoke(null); 
      MethodInfo helloWorld = type.GetMethod("helloWorld"); 
      helloWorld.Invoke(obj, null); 
     } 
     static void Main(string[] args) 
     { 
      Type type = typeof(Class2); 
      callCorrectClass(new Object(), type); 
     } 
    } 
}