Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用T参数评价其c型#_C#_Generics_Parameters_Typeof - Fatal编程技术网

C# 如何使用T参数评价其c型#

C# 如何使用T参数评价其c型#,c#,generics,parameters,typeof,C#,Generics,Parameters,Typeof,我想计算一个T参数来执行一个常见的行为 我试着从不同的按钮调用这个方法 private void Execute<T>(string strValue) { //Do operations this.SaveObject<T>(); } private void Execute(字符串strValue) { //做手术 这是SaveObject(); } 按钮1 this.Execute<Employee>("somevalue1");

我想计算一个T参数来执行一个常见的行为

我试着从不同的按钮调用这个方法

private void Execute<T>(string strValue)
{
     //Do operations
     this.SaveObject<T>();
}
private void Execute(字符串strValue)
{
//做手术
这是SaveObject();
}
按钮1

this.Execute<Employee>("somevalue1");
this.Execute(“somevalue1”);
按钮2

this.Execute<Supplier>("somevalue2");
this.Execute(“somevalue2”);
但问题是,当我想定义SaveObject方法时,如何计算T。我尝试了这个方法,但我告诉我T是一个参数,我将它用作变量

private void SaveObject<T>()
{
    //Here the problem
    if(T is Employee)
    {
        //Do something
    }
    if(T is Supplier)
    {
        //Do something
    }
}
private void SaveObject()
{
//问题就在这里
如果(T是雇员)
{
//做点什么
}
如果(T是供应商)
{
//做点什么
}
}
我想知道类型是什么,然后做具体的操作。所有对象都继承EntityObject

----编辑---

在提问的那一刻,我唯一需要解决问题的就是Silvermind的“回答评论”。(typeof(T))然后我采用了很多人的方法来改进体系结构

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

无论如何,感谢大家。

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

编辑

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

    private void SaveObject<T>()
    {
        //Here the problem
        if (typeof(Employee).IsAssignableFrom(typeof(T)))
        {
            //Do something
        }
    }
private void SaveObject()
{
//问题就在这里
if(typeof(Employee).IsAssignableFrom(typeof(T)))
{
//做点什么
}
}

抱歉之前没有那么明确。

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
    }
}
公共抽象类BaseManager,其中T:class{
公共虚拟void SaveObject(){
//一些常见的保存逻辑(如果可以的话)
}
}
公共类EmployeeManager:BaseManager{
public override void SaveObject()
{
//您的保存逻辑
}
}

希望这有帮助!祝你好运

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

if (typeof(T)==typeof(SomeType))
很可能你的逻辑有错误。您可能需要执行方法重载。如果您只知道如何处理
SomeType
SomeOtherType
,那么为什么不使用
Save(SomeType)
Save(SomeOtherType)

如果可以,也许可以使类型符合接口或具有基类。这样,您就可以像这样重新定义它,并将保存项的工作转移到自身上,并在处理程序线程中保留所有prep和post逻辑::

void Save<T>(T item) where T:ICanSave
{
       //prep code here
      item.Save()
       //finalize code here
}
作废保存(T项),其中T:ICanSave
{
//这里是准备代码
item.Save()
//在这里完成代码
}
当然,可能您的对象不需要知道如何保存自身,因此您可能希望将实现移动到提供程序中,这样就有了一个
SaveProvider
,并且只要有人向您发送一个提供程序,就可以保存任意项

void Save<T>(T item,SaveProvider<T> provider){
       //prep code here
      provider.Save(item)
      //finalize code here
}
void保存(T项,保存提供程序){
//这里是准备代码
provider.Save(项目)
//在这里完成代码
}

当然,你也可以默认这些东西

听起来T不再是通用的了。给他们两个都提供一个通用的
ISaveableObject
接口,并在该接口上约束泛型。
if(typeof(T)=typeof(Employee))
您的设计完全错误。@DavidHeffernan我会对该注释投一千次赞成票。“我必须解开项目中根深蒂固的错误,这一点都不好玩。”Silvermind是的,在应该是一个简单的编译时方法解析中使用反射。(假设下一步是调用特定于类型的方法)@DavidHeffernan我真的很喜欢否决这些非答案。澄清是为每个人准备的。投票人当然知道如何使用System.Type。@DavidHeffernan-很公平-谢谢你提醒我改进我的答案。如果用泛型类型的参数调用方法,只有在泛型类型的约束满足时,才会考虑方法和重载。如果泛型类型的约束不满足重载,则重载将不会用于任何泛型类型——甚至是满足其要求的类型。我认为,当您仅在接口上调用
Save
方法时,您在第一次调用时并不真正需要泛型类型约束。我的意思是说:
void Save(ICanSave item){item.Save();}
。这与其说是“逻辑上的错误”,不如说是“设计上的错误”。@SilverMind,
ICanSave
,这是正确的,但Save可能会将其添加到
列表中,或者它会更新
ICanSave
,我们不知道在准备和完成步骤中还会发生什么@西蒙·怀特黑德,你完全正确。对不起,我写得很快。如果你能控制所讨论的类型,那可能是最好的选择。不幸的是,这是不可能的,因此可能必须根据类型做出运行时决策。如果使用IoC正确设置了解决方案,并且BaseManager中存在具有该类型的抽象属性,然后,您可以将IEnumerable注入构造函数,然后根据类型SingleOrDefault正确的具体管理器…如果您无法提前控制所使用的类型。(此解决方案假定存在容器可以解析的IManager或其他接口。)
HighCore是正确的
-谢谢=)。这就是为什么我最近没有得到太多的名声。我一直在评论这些问题,并把它留给其他人来创造答案+1.