簡體   English   中英

如何將靜態字符串與對象類型C#相關聯

[英]How can i associate a static string with an object type C#

我有一個查詢rest API的方法,在該API中我執行了從JSON到對象的映射。 由於我傳遞給此方法的查詢字符串和對象類型始終必須匹配,因此我想將查詢字符串作為靜態字符串包括在內。

public class Root
{
    public static string Query;
}

public class RootObject : Root, IRootObject
{
    public D d { get; set; }
    public static new string Query = "AccountSet";
}

public interface IRootObject
{
    D d  { get; }
}

public class RestClass
{
     public void Connect<T>() where T : Root, IRootObject
     {    
        T.Query  <-- fails (not actual code. Just to show my problem)
     }  
}

您可以為此使用自定義屬性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class QueryAttribute : Attribute
{
    public string QueryString { get; private set; }

    public QueryAttribute(string queryString)
    {
        QueryString = queryString;
    }

    public static string GetQueryStringForType(Type type)
    {
        var queryAttr = type.GetCustomAttributes(typeof(QueryAttribute), false)
                            .FirstOrDefault() as QueryAttribute;

        return queryAttr != null ? queryAttr.QueryString : null;
    }
}

在課堂上使用它:

[Query("AccountSet")]
public class RootObject : Root, IRootObject
{
    public D d { get; set; }
}

並檢索這樣的值:

public void Connect<T>() where T : Root, IRootObject
{
    var query = QueryAttribute.GetQueryStringForType(typeof(T));
}

與諸如Delphi之類的語言相反,C#和.NET CLI通常不支持靜態多態性的概念。

因此,您將需要一些其他方式來將特定於類型的信息附加到您的類型上,我在這里建議其中兩種:

  1. 您可以使用自定義屬性來標記您的類。 可以使用反射方法(例如GetCustomAttributes typeof(T)typeof(T)檢索該屬性。 定義屬性類后,對於要傳遞給T每種類型,都非常容易聲明這些屬性。 缺點是沒有辦法在編譯時檢查傳遞給T每個類是否都被這樣的屬性修飾。
  2. 或者,您可以使用“信息對象”。 創建一個基類ObjectInfo<T>充當工廠類型的實例T 作為用於一些元信息的存儲T ,例如你的Query字符串。 對於要傳遞給T每種類型,請為ObjectInfo<T> where T : Root子類化ObjectInfo<T> where T : Root類(例如,創建一個類RootObjectInfo : ObjectInfo<RootObject>來覆蓋ObjectInfo<T>Query屬性以返回適當的字符串)。 然后,修改Connect<T> ,使其需要ObjectInfo<T>作為參數。

暫無
暫無

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

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