在类和泛型类之间共享代码

时间:2016-10-11 12:53:37

标签: c# generics activator

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

var foo = new Foo<Bar>();

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

要在运行时使用它,构造函数需要将参数作为参数。 E.g。

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

类中的其余代码是相同的,所以如果这是两个不同的类,那么会有很多重复的代码。

的问题:

  • 如何共享代码并避免重复代码?
  • 可以(并且应该)这是同一类的两个构造函数吗?
  • 我采取了错误的做法吗?也许new Foo(typeof(Bar))

2 个答案:

答案 0 :(得分:0)

我尝试使用自定义构造函数来解决您的问题。那没起效。这是因为C#对待Foo <Bar&gt;和Foo <Int&gt;完全是其他类型。因此,接收该类型的构造函数不起作用。

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

[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(No generics)将为您创建对象。包括单元测试以检查效果!

答案 1 :(得分:0)

好的,我现在已经想到了这个!

我分两个班;一个正常,一个通用。泛型的继承自普通的,并且具有从基类调用构造函数的通用构造函数。

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

    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))
        {
        }
    }

现在我可以使用普通类或泛型类来实例化我的类。

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

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