我想评估T参数以执行常见行为。
我试图从不同的按钮调用此方法
private void Execute<T>(string strValue)
{
//Do operations
this.SaveObject<T>();
}
Button1的
this.Execute<Employee>("somevalue1");
将Button2
this.Execute<Supplier>("somevalue2");
但问题是当我想在那时定义SaveObject方法时如何评估T.我尝试了这个但是我告诉我T是一个参数而我将它用作变量。
private void SaveObject<T>()
{
//Here the problem
if(T is Employee)
{
//Do something
}
if(T is Supplier)
{
//Do something
}
}
我想知道什么类型,然后进行我的具体操作。所有对象都继承EntityObject
------ ------ EDIT
在问题的那一刻,我唯一需要解决我的问题的是Silvermind的“回答评论”。 (typeof(T))然后我采取了许多人的方法来改进架构。
如果Silvermind将我的问题作为答案而不是评论来解决,那将是我接受的答案。
无论如何,感谢你们所有人。
答案 0 :(得分:6)
HighCore是正确的,如果要实现此功能,最好的选择是使用支持的虚方法创建抽象基类,然后在继承自抽象基类的特定于类的类中覆盖它们。类似于:
public abstract class BaseManager<T> where T : class {
public virtual void SaveObject() {
// Some common save logic if it can be done
}
}
public class EmployeeManager : BaseManager<Employee> {
public override void SaveObject()
{
// Your save logic
}
}
希望这有帮助!祝你好运!
答案 1 :(得分:3)
您可以在通用方法中使用typeof(T)
。
修改强>
为了澄清(对于喜欢downvoting的人:-)),您可以在方法中使用以下信息:
private void SaveObject<T>()
{
//Here the problem
if (typeof(Employee).IsAssignableFrom(typeof(T)))
{
//Do something
}
}
道歉之前没有明确表示。
答案 2 :(得分:3)
如果您发现自己在编写通用代码
if (typeof(T)==typeof(SomeType))
您的逻辑中很可能存在一些错误。您可能希望执行方法重载。如果您只知道如何处理SomeType
和SomeOtherType
,那么为什么没有Save(SomeType)
,Save(SomeOtherType)
。
如果可以,您可以使您的类型符合接口或具有基类。这样你可以像这样重新定义它,并将项目保存在自身上,并将所有准备和后置逻辑保留在处理程序线程中::
void Save<T>(T item) where T:ICanSave
{
//prep code here
item.Save()
//finalize code here
}
当然,也许您的对象不需要知道如何保存自己,因此您可能希望将实现移动到提供程序中以便存在SaveProvider<T>
,因此可以保存任意项如果有人发给你一个提供者......
void Save<T>(T item,SaveProvider<T> provider){
//prep code here
provider.Save(item)
//finalize code here
}
当然你也可以默认这个东西。