转换为通用抽象类将T显示为未解析的符号

时间:2009-07-24 00:31:46

标签: c# generics

让我说我有这个:

public abstract class myClass<T> : Ob<T> where T : Ob<T>, new()

现在在abstract myClass中定义的方法中,我创建了一个类myType的对象,并且在myType中定义的方法上,我传递了调用它的抽象类myClass。

所以在我的myType类中,我有:

public void myMethod(object caller)

我的问题是,如何将对象调用者强制转换为调用它的抽象类的类型?

我试过

(myClass<T>) 

(myClass)

但都失败了。

仿制药让我头疼。

2 个答案:

答案 0 :(得分:3)

您可以使用 as 执行此操作,如下所示:

public void MyMethod(object caller)
{
    myClass<T> test = caller as myClass<T>;
    if (test != null)
    {
         // Use test here
    }
}

话虽如此,如果你总是传递一个已知的myClass<T>,那么它可能更干净:

public void MyMethod(myClass<T> caller)
{
     // Use caller directly...
}

编辑:为了演示,这是一个小样本:

using System;

public class myClass<T> where T : new()
{
    public T Value;

    public void CopyFromSecond(object caller)
    {
        myClass<T> test = caller as myClass<T>;
        this.Value = test.Value;
    }
}
class Program
{
    static void Main(string[] args)
    {
        myClass<int> test = new myClass<int> { Value = 3 };
        myClass<int> test2 = new myClass<int> { Value = 5 };

        Console.WriteLine(test.Value);
        test.CopyFromSecond(test2);
        Console.WriteLine(test.Value);
        Console.ReadKey();
    }
}

按照预期打印3然后打印5个。


编辑2:

如果您尝试从另一个myClass<T>中找到T的类型,则需要使用反射。您需要的方法是Type.GetGenericTypeDefinition

答案 1 :(得分:0)

为什么你首先需要演员?也许你想要:

public void myMethod<T>(myClass<T> caller)

否则,您的问题的答案是 - 您不能,因为您不知道myClass的哪个特定专业称呼您。