在 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,那么就会有很多重复代码。
问题:
- 如何共享代码并避免重复代码?
- 这可以(并且应该)是同一个 class 的两个构造函数吗?
- 我是不是采取了错误的方法?也许
new Foo(typeof(Bar))
?
我尝试使用自定义构造函数解决您的问题。它不起作用。这是因为 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();
我正在开发一个 class,它创建一个 class 的实例(使用 Activator.CreateInstance
),该实例指定给 class(作为类型参数或作为构造函数的参数),因此当 class 创建实例时创建 class 的实例是毫无意义的,因此使用泛型传递类型是有意义的。例如
var foo = new Foo<Bar>();
但是,这使得 class 无法在 运行 时使用,因为类型参数是在编译时声明的。
要在 运行 时使用它,构造函数需要将参数作为参数。例如
var foo = new Foo(new Bar());
尽管 classes 中的其余代码是相同的,因此如果这是两个不同的 classes,那么就会有很多重复代码。
问题:
- 如何共享代码并避免重复代码?
- 这可以(并且应该)是同一个 class 的两个构造函数吗?
- 我是不是采取了错误的方法?也许
new Foo(typeof(Bar))
?
我尝试使用自定义构造函数解决您的问题。它不起作用。这是因为 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();