2010-09-29 94 views
1

嘿。是否有可能让一个方法允许用户传入某个特定类型的参数并让该方法实例化一个新类型的对象?我愿做这样的事情:(我不知道,如果仿制药是要走的路,但给它一个镜头)创建参数类型对象

public void LoadData<T>(T, string id, string value) where T : new() 
    { 

     this.Item.Add(new T() { ID=id, Val = value}); 

    } 

以上不工作,但这个想法是用户传递他们想要实例化的对象类型,并且方法将根据这些参数填充细节。 我只能通过一个Enum参数并做一个Switch并基于此创建新的对象,但有没有更好的方法? 谢谢

回答

6

这样做会增加一个接口,还规定要设置的参数的唯一方法:

public interface ISettable 
{ 
    string ID { get; set; } 
    string Val { get; set; } 
} 

public void LoadData<T>(string id, string value) where T : ISettable, new() 
{ 
    this.Item.Add(new T { ID = id, Val = value }); 
} 

不幸的是我无法通过测试来验证的时刻。

+0

这些属性与一个接口签约。 – XSL 2010-09-29 18:08:37

+0

@SSL - 然后只要接口还需要setter,您只需要将该接口添加到约束。 – 2010-09-29 18:13:44

+0

谢谢,这个作品完美。 – XSL 2010-09-29 18:14:30

1

如果IDVal属性来自共同的基类或接口,则可以限制T继承该类型。

例如:

public void LoadData<T>(string id, string value) where T : IMyInterface, new() 

然后可以使用的IMyInterface所有成员T实例。

如果他们只是不相关的属性在不同类型碰巧具有相同的名称,你必须使用反射。

此外,您需要从参数列表中删除T,

+0

感谢您的帮助。 – XSL 2010-09-29 18:14:47

0

更加动态类型化的语言可以轻松地做到这一点。我相信它可能在C#中,它只需要更多的努力。 Theres可能有一些反射库可以帮助你。

为什么不在调用方法时创建对象?你想要做的事似乎对我来说过于复杂。

+0

C#代码非常简单。几乎适用于我的应用程序。我不知道对象类型是什么,这是问题所在。 – XSL 2010-09-29 19:03:19

+0

但是,当您调用该方法以使其工作时,您必须知道对象类型。 – toc777 2010-09-29 23:10:20

+0

现在您使用的界面在我看来似乎可以消除泛型,只依赖于界面。 – toc777 2010-09-29 23:22:19