如何实现接口来处理类型转换类?

时间:2008-11-25 19:12:01

标签: c#-3.0 casting

我想将类的tType传递给函数,将类对象传递给泛型函数。

我需要能够转换为类型(类),以便我可以访问类的方法。

类似的东西:

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

为这些类实现接口然后转换到该接口工作? 如果是这样,有人可以举个例子吗?

过去几个小时我一直在谷歌搜索,我以前从来没有这么做过。

有人可以解释一下吗?

6 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

您可以在方法调用中使用泛型吗?类似的东西:

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

希望有所帮助!

答案 2 :(得分:0)

答案 3 :(得分:0)

您尝试做的是动态演员。这在C#中不存在。

您可以尝试以下方法之一:

  • 声明要在基类或接口中使用的成员并转换为该成员。
  • 使用Generics,如Zachary Yates的代码示例:

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

答案 4 :(得分: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
      }

答案 5 :(得分: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);
        }
    }
}