在這種情況下,一個常見的模式是有一個非泛型基類型的泛型基類型。如果你的方法不涉及類型參數,那麼你就完成了。如果是這樣,你可以,做一個類型轉換爲非泛型方法,類似添加的Object.Equals:
public abstract class ReallyBaseType
{
public abstract void SomeMethod();
public abstract void SomeMethodWithParameter(object o);
}
public abstract class BaseType<TEntity> : ReallyBaseType
where TEntity : BaseType<TEntity>
{
public override void SomeMethodWithParameter(object o)
{
SomeMethodWithParameter((TEntity)o);
}
public abstract void SomeMethodWithParameter(TEntity entity);
}
public class AnyType : BaseType<AnyType>
{
public override void SomeMethod() { }
public override void SomeMethodWithParameter(AnyType entity) { }
}
然後,你可以檢查實際數據類型:
public void Method<T>(T data)
{
if (data is ReallyBaseType)
{
((ReallyBaseType)(object)data).SomeMethod();
}
}
編輯:我覺得你卡住了反射,然後。如果您希望能夠針對具體類型編寫代碼,則可以創建通用方法並使用反射調用它:
public class TestClass
{
private static MethodInfo innerMethodDefinition =
typeof(TestClass).GetMethod("InnerMethod");
public void Method(object data)
{
var t = data.GetType();
while (t != null &&
!(t.IsGenericType &&
t.GetGenericTypeDefinition() == typeof(BaseType<>)))
{
t = t.BaseType;
}
if (t != null &&
t.GetGenericArguments()[0].IsAssignableFrom(data.GetType()))
{
innerMethodDefinition.MakeGenericMethod(
t.GetGenericArguments()[0]).Invoke(this, new object[] { data });
}
}
public void InnerMethod<TEntity>(TEntity data)
where TEntity : BaseType<TEntity>
{
// Here you have the object with the correct type
}
}
10x for reply! 但我需要額外的功能。 public void方法(T數據) 對數據執行BaseType <>方法... 我使用反射,但我更喜歡類型轉換爲BaseType <>。 可能嗎? –
sh1ng
2010-07-22 10:56:49