簡體   English   中英

c# 基於值而不是引用調度擴展方法

[英]c# Dispatching Extension Methods based on Value not Reference

鑒於以下2種擴展方法

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,我如何執行第二個擴展方法? 我正在尋找靜態多態性。

嘗試這個

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

你需要double dispatch Double dispatch根據運行時的實際類型確定調度

public class IdPropertyNameResolver
{
    public string GetIDPropertyName(object value)=>"ID";

    public string GetIDPropertyName<T>(EntityRestIdentityDescriber<T> value)=>
        value.propertyNameDescribingID();
}
//......do something
object o = new CustomEntityRestModelIdentity();
new IdPropertyNameResolver().GetIDPropertyName((dynamic)o);//CustomEntityRestModelIdentity id name
//......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM