在 class 和通用 class 之间共享代码

Share code between a class and a generic class

我正在开发一个 class,它创建一个 class 的实例(使用 Activator.CreateInstance),该实例指定给 class(作为类型参数或作为构造函数的参数),因此当 class 创建实例时创建 class 的实例是毫无意义的,因此使用泛型传递类型是有意义的。例如

var foo = new Foo<Bar>();

但是,这使得 class 无法在 运行 时使用,因为类型参数是在编译时声明的。

要在 运行 时使用它,构造函数需要将参数作为参数。例如

var foo = new Foo(new Bar());

尽管 classes 中的其余代码是相同的,因此如果这是两个不同的 classes,那么就会有很多重复代码。

问题:

我尝试使用自定义构造函数解决您的问题。它不起作用。这是因为 C# 将 Foo<Bar> 和 Foo<Int> 视为完全不同的类型。所以接收类型的构造函数不起作用。

下一个解决方案是引入通用静态 class 来帮助解决这个问题:

[TestClass]
public class FooBarTest
{
    [TestMethod]
    public void TestFooBar()
    {
        var foo = new Foo<Bar>();
        var foo2 = Foo.CreateFoo(new Bar());
        Assert.AreEqual(foo.GetType(), foo2.GetType());
    }
}


public class Foo<T> 
{
    public Foo()
    {

    }

    public Foo(T obj)
    {

    }
}

public static class Foo
{
    public static Foo<TType> CreateFoo<TType>(TType obj)
    {
        return new Foo<TType>(obj);
    }
}

public class Bar
{

}

这意味着 Static class Foo(无泛型)将为您创建对象。包含单元测试以检查效果!

好的,我现在想通了!

我做了两个单独的 class;一种是普通的,一种是通用的。通用的继承自普通的并且有一个通用的构造函数,它从基础class.

调用构造函数

普通的class需要接受Type作为参数的构造函数(这个构造函数不必是public,它可以是protected)。此构造函数是从通用 class.

调用的
    public class Foo
    {
        private readonly object _bar;

        public Foo(Bar bar) : this(bar.GetType())
        {
        }

        protected Foo(Type bar)
        {
            _bar = Activator.CreateInstance(bar);
        }

        public void Write()
        {
            Console.WriteLine(_bar);
        }
    }

    public class Foo<T> : Foo
    {
        public Foo() : base(typeof(T))
        {
        }
    }

现在我可以使用普通 class 或通用 class 实例化我的 class。

    var foo1 = new Foo(new Bar());
    foo1.Write();

    var foo2 = new Foo<Bar>();
    foo2.Write();