如何使用T参数来评估其类型c#

时间:2013-11-26 21:55:46

标签: c# generics parameters typeof

我想评估T参数以执行常见行为。

我试图从不同的按钮调用此方法

private void Execute<T>(string strValue)
{
     //Do operations
     this.SaveObject<T>();
}

Button1的

this.Execute<Employee>("somevalue1");

将Button2

this.Execute<Supplier>("somevalue2");

但问题是当我想在那时定义SaveObject方法时如何评估T.我尝试了这个但是我告诉我T是一个参数而我将它用作变量。

private void SaveObject<T>()
{
    //Here the problem
    if(T is Employee)
    {
        //Do something
    }
    if(T is Supplier)
    {
        //Do something
    }
}

我想知道什么类型,然后进行我的具体操作。所有对象都继承EntityObject

------ ------ EDIT

在问题的那一刻,我唯一需要解决我的问题的是Silvermind的“回答评论”。 (typeof(T))然后我采取了许多人的方法来改进架构。

如果Silvermind将我的问题作为答案而不是评论来解决,那将是我接受的答案。

无论如何,感谢你们所有人。

3 个答案:

答案 0 :(得分:6)

HighCore是正确的,如果要实现此功能,最好的选择是使用支持的虚方法创建抽象基类,然后在继承自抽象基类的特定于类的类中覆盖它们。类似于:

public abstract class BaseManager<T> where T : class {
    public virtual void SaveObject() {
        // Some common save logic if it can be done
    }
}

public class EmployeeManager : BaseManager<Employee> {
    public override void SaveObject() 
    {
        // Your save logic
    }
}

希望这有帮助!祝你好运!

答案 1 :(得分:3)

您可以在通用方法中使用typeof(T)

修改

为了澄清(对于喜欢downvoting的人:-)),您可以在方法中使用以下信息:

    private void SaveObject<T>()
    {
        //Here the problem
        if (typeof(Employee).IsAssignableFrom(typeof(T)))
        {
            //Do something
        }
    }

道歉之前没有明确表示。

答案 2 :(得分:3)

如果您发现自己在编写通用代码

if (typeof(T)==typeof(SomeType))

您的逻辑中很可能存在一些错误。您可能希望执行方法重载。如果您只知道如何处理SomeTypeSomeOtherType,那么为什么没有Save(SomeType)Save(SomeOtherType)

如果可以,您可以使您的类型符合接口或具有基类。这样你可以像这样重新定义它,并将项目保存在自身上,并将所有准备和后置逻辑保留在处理程序线程中::

void Save<T>(T item) where T:ICanSave
{
       //prep code here
      item.Save()
       //finalize code here
}

当然,也许您的对象不需要知道如何保存自己,因此您可能希望将实现移动到提供程序中以便存在SaveProvider<T>,因此可以保存任意项如果有人发给你一个提供者......

void Save<T>(T item,SaveProvider<T> provider){
       //prep code here
      provider.Save(item)
      //finalize code here
}

当然你也可以默认这个东西。