我想将类的tType传递给函数,将类对象传递给泛型函数。
我需要能够转换为类型(类),以便我可以访问类的方法。
类似的东西:
void GenericFunction(Object obj, Type type)
{
(type)obj.someContainer.Add(1);
}
为这些类实现接口然后转换到该接口工作? 如果是这样,有人可以举个例子吗?
过去几个小时我一直在谷歌搜索,我以前从来没有这么做过。
有人可以解释一下吗?
答案 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);
}
}
}