C#如何创建泛型类型参数

C#如何创建泛型类型参数,c#,.net,generics,types,C#,.net,Generics,Types,我有需要扩展的现有测试代码 为了减少代码重复,我希望尽可能保持通用性,以下是当前代码的简化片段: public class FilterValueOne { } [TestClass] public class TestClass { [TestMethod] public void FilterValueOne_TestMethod() { ManipulateData(BuildFil

我有需要扩展的现有测试代码

为了减少代码重复,我希望尽可能保持通用性,以下是当前代码的简化片段:


    public class FilterValueOne { }

    [TestClass]
    public class TestClass
    {
        [TestMethod]
        public void FilterValueOne_TestMethod()
        {
            ManipulateData(BuildFilter());
        }

        private void ManipulateData(FilterValueOne filter)
        {
            // Do some stuff with filter
        }

        private FilterValueOne BuildFilter()
        {
            var filter = new FilterValueOne();
            // Initialize filter data members here...
            return filter;
        }
    }

这是可行的,但仅限于“FilterValueOne”类型

我想通过实现一个泛型类型参数来扩展它,使它更通用

下面的代码片段是我想要的:


    // Enum will expand as the app grows
    public enum TypeEnum
    {
        ValueOne,
        ValueTwo,
        ValueThree
    }

    // More classes will be added as the app grows
    public class FilterValueOne { }
    public class FilterValueTwo { }
    public class FilterValueThree { }

    [TestClass]
    public class TestClassGeneric
    {
        // _filter to be used as the generic type argument
        private object _filter;

        // Constructor
        public TestClassGeneric(TypeEnum val)
        {
           switch (val)
           {
               case TypeEnum.ValueOne:
                   _filter = GetTestObject<FilterValueOne>();
                   break;
               case TypeEnum.ValueTwo:
                   _filter = GetTestObject<FilterValueTwo>();
                   break;
               case TypeEnum.ValueThree:
                   _filter = GetTestObject<FilterValueThree>();
                   break;
               default:
                   _filter = null;
                   break;
           }
        }

        private T GetTestObject<T>()
          where T : class
        {
           // Code simplified
           object returnValue = new object();
           return (T)returnValue;
        }

        [TestMethod]
        public void Generic_FilterValue_TestMethod()
        {
            // Error: The type _filter could not be found. (However it exists)
            ManipulateData(BuildFilter<_filter>());
        }

        private void ManipulateData<T>(T filter)
        {
            // Do some stuff with filter
        }    

        private T BuildFilter<T>()
         where T : class
        {
            // I want filter to be dynamically assigned to whatever _filter was
            // assigned to in the constructor (FilterValueOne/Two/Three), instead 
            // of "FilterValueOne"

            var filter = typeof(T);

            // Initialize filter data members here...

            return filter;
        }
    }


//Enum将随着应用程序的增长而扩展
公共枚举类型枚举
{
ValueOne,
第二,
价值三
}
//随着应用程序的增长,将添加更多的类
公共类FilterValueOne{}
公共类FilterValue 2{}
公共类FilterValueThree{}
[测试类]
公共类TestClassGeneric
{
//\u要用作泛型类型参数的筛选器
私有对象过滤器;
//建造师
公共TestClassGeneric(TypeEnum val)
{
开关(val)
{
案例类型Enum.ValueOne:
_filter=GetTestObject();
打破
案例类型enum.ValueTwo:
_filter=GetTestObject();
打破
案例类型Enum.ValueThree:
_filter=GetTestObject();
打破
违约:
_filter=null;
打破
}
}
私有T GetTestObject()
T:在哪里上课
{
//代码简化
对象返回值=新对象();
返回(T)返回值;
}
[测试方法]
public void Generic_FilterValue_TestMethod()
{
//错误:找不到类型_筛选器。(但是它存在)
操纵数据(BuildFilter());
}
专用数据(T过滤器)
{
//用过滤器做些东西
}    
私有T BuildFilter()
T:在哪里上课
{
//我希望过滤器被动态地分配给任何过滤器
//而是在构造函数中指定给(FilterValue 1/2/3)
//“FilterValueOne”的定义
var过滤器=类型(T);
//在此处初始化筛选器数据成员。。。
回流过滤器;
}
}
我最终希望在我的测试方法中使用“_filter”作为泛型类型参数,但我无法让它工作。我收到一个错误,说明“找不到过滤器”

我尝试了多种使用typeof(_filter)等的方法,但没有成功


我不完全理解泛型及其潜力,我甚至不知道这是否可能,或者我只是缺少了一些东西。

使用泛型测试类更容易,但如果您更喜欢通过构造函数传递过滤器类型,或者将其作为方法参数,则可以使用
Activator

public class TestClassGeneric<T> where T : new()
{
    public void Generic_FilterValue_TestMethod()
    {
        var filter = new T();
        // ManipulateData(filter);
    }
}

public class TestClassConstructorArg
{
    private readonly Type type;

    public TestClassConstructorArg(Type type)
    {
        this.type = type;
    }

    public void Generic_FilterValue_TestMethod()
    {
        var filter = Activator.CreateInstance(type);
        // var filter = Activator.CreateInstance(type, BindingFlags.CreateInstance, arguments...);
        // ManipulateData(filter);
    }
}
公共类TestClassGeneric其中T:new()
{
public void Generic_FilterValue_TestMethod()
{
var filter=newt();
//操纵数据(过滤器);
}
}
公共类TestClassConstructorArg
{
私有只读类型;
公共TestClassConstructorArg(类型)
{
this.type=type;
}
public void Generic_FilterValue_TestMethod()
{
var filter=Activator.CreateInstance(类型);
//var filter=Activator.CreateInstance(类型,BindingFlags.CreateInstance,参数…);
//操纵数据(过滤器);
}
}

使用泛型测试类更容易,但如果您更喜欢将过滤器类型传递给构造函数或作为方法参数,则可以使用
激活器

public class TestClassGeneric<T> where T : new()
{
    public void Generic_FilterValue_TestMethod()
    {
        var filter = new T();
        // ManipulateData(filter);
    }
}

public class TestClassConstructorArg
{
    private readonly Type type;

    public TestClassConstructorArg(Type type)
    {
        this.type = type;
    }

    public void Generic_FilterValue_TestMethod()
    {
        var filter = Activator.CreateInstance(type);
        // var filter = Activator.CreateInstance(type, BindingFlags.CreateInstance, arguments...);
        // ManipulateData(filter);
    }
}
公共类TestClassGeneric其中T:new()
{
public void Generic_FilterValue_TestMethod()
{
var filter=newt();
//操纵数据(过滤器);
}
}
公共类TestClassConstructorArg
{
私有只读类型;
公共TestClassConstructorArg(类型)
{
this.type=type;
}
public void Generic_FilterValue_TestMethod()
{
var filter=Activator.CreateInstance(类型);
//var filter=Activator.CreateInstance(类型,BindingFlags.CreateInstance,参数…);
//操纵数据(过滤器);
}
}

BuildFilter
中的
T
是一个类型参数。您正在传递一个类型的实例,在您的示例中是
object
(又称
System.object
)而不是类型的实例

您根本无法做到这一点,因此编译器错误(
\u filter
不是一个类型;它是一个实例,这就是编译器找不到该“类型”的原因)

您要做的是实例化一个特定的
BuildFilter
,等等,并创建测试这些东西的测试

比如说

[TestMethod]
public void Generic_FilterValueOne_TestMethod()
{
    ManipulateData(new BuildFilter<FilterValueOne>());
}
[TestMethod]
public void Generic_FilterValueOne_TestMethod()
{
操纵数据(新建BuildFilter());
}

看起来您正在使用MS测试;AFAIK MS测试不支持通用测试,因此您必须为您感兴趣的每种类型创建一个测试。

BuildFilter中的
T
是一个类型参数。您正在传递一个类型的实例,在您的示例中是
object
(又称
System.object
)而不是类型的实例

您根本无法做到这一点,因此编译器错误(
\u filter
不是一个类型;它是一个实例,这就是编译器找不到该“类型”的原因)

您要做的是实例化一个特定的
BuildFilter
,等等,并创建测试这些东西的测试

比如说

[TestMethod]
public void Generic_FilterValueOne_TestMethod()
{
    ManipulateData(new BuildFilter<FilterValueOne>());
}
[TestMethod]
public void Generic_FilterValueOne_TestMethod()
{
操纵数据(新建BuildFilter());
}

看起来您正在使用MS测试;AFAIK MS测试不支持通用测试,因此您必须为您感兴趣的每种类型创建一个测试。

为什么
\u filter
是静态的?请注意
newobject()
i