C# 用属性扩展String类?

C# 用属性扩展String类?,c#,string,extension-methods,C#,String,Extension Methods,我有一个应用程序,需要用公司名称填充文本框,并用数据库中所有可用的公司名称填充自定义的AutoCompleteTestringCollection。当用户通过键入并从列表中选择新的公司名称来输入或更改公司名称时,我需要具有所选公司的id(Guid),以便我可以进行查找并获取公司的其余信息。因为公司名称不能保证是唯一的,所以我无法在名称上进行查找并期望有正确的记录。我研究了如何扩展string类,但我能找到的只是添加方法的示例。我尝试通过添加一个变量来存储id以及获取和设置id的方法,但是在检索i

我有一个应用程序,需要用公司名称填充文本框,并用数据库中所有可用的公司名称填充自定义的AutoCompleteTestringCollection。当用户通过键入并从列表中选择新的公司名称来输入或更改公司名称时,我需要具有所选公司的id(Guid),以便我可以进行查找并获取公司的其余信息。因为公司名称不能保证是唯一的,所以我无法在名称上进行查找并期望有正确的记录。我研究了如何扩展string类,但我能找到的只是添加方法的示例。我尝试通过添加一个变量来存储id以及获取和设置id的方法,但是在检索id时,它总是最后一个id集。可以通过扩展属性将其添加到类中吗?我已经更改了我试图执行的操作,以便在公司名称上进行查找,并显示一个列表,如果返回多个匹配项,用户将从中选择该列表,但我仍然想知道是否可以通过这种方式添加属性,以防再次出现该属性。

否,不能使用属性扩展类。此外,
String
是密封的,因此不能通过继承来扩展它。唯一的方法是组合:将
字符串
封装到您自己的类中。

听起来您应该创建自己的类:

class Company {
    public string Name {get;set;}
    public override string ToString() {return Name;}
    // etc
}

现在绑定到一组
公司
对象;
ToString
覆盖将确保默认情况下显示
名称
,并且您可以添加任何其他需要的内容。对于更复杂的场景,您可以使用(例如)
DisplayMember
ValueMember
(组合框)指向不同的属性(而不是默认的
ToString
)。

您应该使用组合框而不是文本框。创建一个包含公司名称和id的自定义类型,确保它覆盖ToString以返回公司名称。将这些自定义类型添加到组合框中,而不是直接添加字符串,并使用ListItems的AutoCompleteSource。

我使用了Konrad的答案,为了完整性,我在这里发布了我的解决方案。我需要向我的用户显示一个公司名称的自动完成列表,但由于他们可能有多个同名公司,我需要Guid id在数据库中找到他们的选择。因此,我编写了自己的类继承自AutoCompleteTestringCollection

    public class AutoCompleteStringWithIdCollection : AutoCompleteStringCollection
{
    private List<Guid> _idList = new List<Guid>();


    /*-- Properties --*/

    public Guid this[int index]
    {
        get
        {
            return _idList[index];
        }
    }

    public Guid this[string value]
    {
        get
        {
            int index = base.IndexOf(value);
            return _idList[index];
        }
    }

    /*-- Methods --*/

    public int Add(string value, Guid id)
    {
        int index = base.Add(value);
        _idList.Insert(index, id);
        return index;
    }

    public new void Remove(string value)
    {
        int index = base.IndexOf(value);
        if (index > -1)
        {
            base.RemoveAt(index);
            _idList.RemoveAt(index);
        }
    }

    public new void RemoveAt(int index)
    {
        base.RemoveAt(index);
        _idList.RemoveAt(index);
    }

    public new void Clear()
    {
        base.Clear();
        _idList.Clear();
    }

}
公共类AutoCompleteStringWithIdCollection:AutoCompleteStringCollection
{
私有列表_idList=新列表();
/*--性质--*/
公共Guid此[int索引]
{
得到
{
返回_idList[索引];
}
}
公共Guid此[字符串值]
{
得到
{
int index=base.IndexOf(值);
返回_idList[索引];
}
}
/*--方法--*/
公共整数添加(字符串值,Guid id)
{
int index=base.Add(值);
_idList.Insert(索引,id);
收益指数;
}
公共新空删除(字符串值)
{
int index=base.IndexOf(值);
如果(索引>-1)
{
基本移动(索引);
_idList.RemoveAt(索引);
}
}
公共新空移除(内部索引)
{
基本移动(索引);
_idList.RemoveAt(索引);
}
公共新空白清除()
{
base.Clear();
_idList.Clear();
}
}