我如何将静态字符串与对象类型关联 C#
How can i associate a static string with an object type C#
我有一个查询休息 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 通常不支持静态多态性的概念。
因此,您将需要一些其他方法来将特定于类型的信息附加到您的类型,我在这里建议其中两种:
- 您可以使用 custom attribute to mark your class. That attribute can be retrieved from
typeof(T)
with reflection methods such as GetCustomAttributes
。一旦定义了属性 class,就可以很容易地为要传递给 T
的每种类型声明这些属性。缺点是无法在编译时检查传递给 T
的每个 class 是否由这样的属性装饰。
- 或者,您可以选择 "info object"。创建一个基础 class
ObjectInfo<T>
作为工厂 T
和 作为 [=12= 上的一些元信息的存储],例如您的 Query
字符串。对于要传递给 T
的每种类型,subclass 您的 ObjectInfo<T> where T : Root
class(例如,创建一个 class RootObjectInfo : ObjectInfo<RootObject>
来覆盖 Query
属性 的 ObjectInfo<T>
到 return 适当的字符串)。然后,修改 Connect<T>
使其需要一个 ObjectInfo<T>
作为参数。
我有一个查询休息 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 通常不支持静态多态性的概念。
因此,您将需要一些其他方法来将特定于类型的信息附加到您的类型,我在这里建议其中两种:
- 您可以使用 custom attribute to mark your class. That attribute can be retrieved from
typeof(T)
with reflection methods such asGetCustomAttributes
。一旦定义了属性 class,就可以很容易地为要传递给T
的每种类型声明这些属性。缺点是无法在编译时检查传递给T
的每个 class 是否由这样的属性装饰。 - 或者,您可以选择 "info object"。创建一个基础 class
ObjectInfo<T>
作为工厂T
和 作为 [=12= 上的一些元信息的存储],例如您的Query
字符串。对于要传递给T
的每种类型,subclass 您的ObjectInfo<T> where T : Root
class(例如,创建一个 classRootObjectInfo : ObjectInfo<RootObject>
来覆盖Query
属性 的ObjectInfo<T>
到 return 适当的字符串)。然后,修改Connect<T>
使其需要一个ObjectInfo<T>
作为参数。