我正在开发一个类,它创建一个类的实例(使用Activator.CreateInstance
),该类被指定给类(作为类型参数或作为构造函数的参数),所以它是无意义的无论如何,当类创建实例时创建类的实例,因此使用泛型传递类型是有意义的。 E.g。
var foo = new Foo<Bar>();
但是,这使得该类无法在运行时使用,因为类型参数是在编译时声明的。
要在运行时使用它,构造函数需要将参数作为参数。 E.g。
var foo = new Foo(new Bar());
类中的其余代码是相同的,所以如果这是两个不同的类,那么会有很多重复的代码。
new Foo(typeof(Bar))
?答案 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();