2017-03-01 29 views
1

考虑以下2种扩展方法C#调度扩展方法不能引用

public static string getIDPropertyName(this object value) 
{ 
    return "ID"; 
} 

public static string getIDPropertyName<IDType>(this EntityRestIdentityDescriber<IDType> entityIdentityDescriber) 
{ 
    return entityIdentityDescriber.propertyNameDescribingID(); 
} 

和下面2调用

//arrange 

object test = new CustomEntityRestModelIdentity(); 
//test.UserName = "KKK"; 
//act 
var actual = test.getIDPropertyName(); //calls the first extension method 
var actual2 = (test as CustomEntityRestModelIdentity).getIDPropertyName(); //calls the second extension method 

我如何可以执行第二扩充方法,即使它的引用类型是对象,但它的值类型是一个EntityRestIdentityDescriber?我正在寻找静态多态。

+0

你的意思是你怎么称呼它,而不铸造? –

+1

扩展方法是在编译时选择的。您已经在问题(actual2)中有一个解决方法。 – buffjape

+0

@AliSheikhNezami这不是测试哈哈。我想要做的是通过反射登陆一个对象,然后调用getIDPropertyName为了获得正确的方法来执行以防对象实现EntityRestIdentityDescriber。如果对象没有实现它,它默认为返回ID的另一个方法。有没有办法调用其他方法没有铸造或继承? –

回答

1

试试这个

public static string getIDPropertyName(this object entityIdentityDescriber) 
{ 
    if(entityIdentityDescriber is EntityRestIdentityDescriber<IDType>) 
     return entityIdentityDescriber.propertyNameDescribingID(); 
    else 
     return "id"; 
} 
+0

是的,我之前想过这样做,但IDType是未定义的,所以我可以'因为我不知道运行时的值,所以真的投了。我不能也删除hte通用限制,因为它在其他地方是必需的。除继承和动态多态之外,没有别的办法吗? –

+0

@SalmanHasratKhan 老实说,我不知道! –