2016-10-11 117 views
-3

我正在开发一个类,它创建一个为类指定的类的实例(使用Activator.CreateInstance)(作为类型参数或作为构造函数的参数),所以当类创建一个实例时,创建类的实例是毫无意义的,因此使用泛型传递类型是有道理的。例如。在一个类和一个通用类之间共享代码

var foo = new Foo<Bar>(); 

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

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

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

的代码中的类,其余都是一样的,所以如果这是两个不同的类,然后会有很多重复的代码。

问题:

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

请解释这背后的目的是什么..目前它还不清楚/太宽..我假设为“共享代码” - 组合/继承。两个构造函数 - 是的,可能的。 'typeof(Bar)' - 这是别的 - 取决于你想做什么 –

+0

我很好奇你的实现是什么样的。从这个问题来看,这听起来更像是继承的候选人而非泛型。或者如果'Foo'依赖于'Bar',那么共同的属性/方法可以调用另一个并避免重复。 – Theo

+4

*我正在开发一个类,该类创建一个为该类指定的类的实例(作为类型参数或作为构造函数的参数),因此在类时创建类的实例是毫无意义的无论如何创建一个实例,因此传递类型使用泛型是有道理的。* ...嗯? –

回答

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(); 
+0

为什么构造函数Foo(酒吧栏)创建一个新实例?你可以简单地_bar = bar。 –

+0

@ R.Rusev,因为这是这个特定类别设计的目的。然而,我编辑了这篇文章以重写它,以便只有一个构造函数执行该任务,现在它调用另一个构造函数以避免重复代码。 – Fred

+0

因此,类(Foo)的目的是始终创建指定类(Bar)的新实例,即使通过将该类(Bar)的现有实例提供给类(Foo)的构造函数来完成该操作? –

0

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

下一个解决方案是一个通用的静态类的介绍,以帮助这一点:

[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 
{ 

} 

这将意味着静态类Foo(没有仿制药)将创建对象为您服务。单元测试包括检查效果!

相关问题