如何让IntelliSense识别CharOrEscape支持Escapes类成员自动补全?
How to Make IntelliSense Show
Escapes Members for CharOrEscape Properties/Parameters 嘿,我懂你要的这个IntelliSense补全效果!你已经定义了Escapes结构体和CharOrEscape类,并且配置了它们之间的隐式转换,现在就想让IntelliSense在处理CharOrEscape类型的属性或参数时,自动列出Escapes的静态成员供选择对吧?这其实可以通过特性配置来实现,给你两种可行的方案:
方案1:使用JetBrains.Annotations特性(推荐,简单高效)
这个方案依赖JetBrains提供的Annotations包,它是专门用来给IDE提供代码提示元数据的,NuGet上可以直接安装。
给你的CharOrEscape类加上两个特性,告诉IntelliSense这个类型可以接受隐式转换来的Escapes类型,并且要显示Escapes的成员:
using JetBrains.Annotations; // 告诉IDE这个类型的成员会被隐式赋值使用 [ImplicitUseKindFlags(ImplicitUseKindFlags.Assign)] // 指定要包含目标类型的成员 [ImplicitUseTargetFlags(ImplicitUseTargetFlags.WithMembers)] public class CharOrEscape { public string Value; private CharOrEscape(string value) => Value = value; public static implicit operator CharOrEscape(Escapes s) => new CharOrEscape(s.ToString()); public static implicit operator CharOrEscape(char c) => new CharOrEscape(c.ToString()); public static implicit operator string(CharOrEscape s) => s.ToString(); public override string ToString() => Value; public override bool Equals(object obj) => ((CharOrEscape)obj).Value == Value; }
加上这两个特性后,当你在赋值CharOrEscape类型的属性或参数时,IntelliSense就会自动弹出Escapes的所有静态成员(比如Escapes.LineFeed、Escapes.Digit等)供你选择。
方案2:自定义特性(不依赖第三方库)
如果你不想引入外部包,可以自己定义一个特性来告诉IDE你的类型接受哪些隐式转换类型。不过注意,自定义特性需要VS的支持,部分版本可能需要额外配置才能生效。
首先定义特性类:
using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = true)] public class ImplicitlyAcceptsAttribute : Attribute { public Type[] AcceptableTypes { get; } public ImplicitlyAcceptsAttribute(params Type[] acceptableTypes) { AcceptableTypes = acceptableTypes; } }
然后给CharOrEscape类标记这个特性,指定它接受Escapes类型:
[ImplicitlyAccepts(typeof(Escapes))] public class CharOrEscape { // 你的原有代码 }
小提示:修复Escapes中的一个小错误
我注意到你Escapes结构体里的CarriageReturn成员定义写错了:
public static readonly Escapes CarriageReturn = new Escapes(new Escapes("\r"));
这里嵌套了new Escapes,应该改成直接传入字符串:
public static readonly Escapes CarriageReturn = new Escapes("\r");
不然运行时会得到错误的转义字符串哦。
内容的提问来源于stack exchange,提问作者Anyone
相关产品推荐
相关产品推荐

