使用属性扩展String类?

时间:2009-01-30 19:38:16

标签: c# string extension-methods

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

4 个答案:

答案 0 :(得分:7)

不,您不能使用属性扩展类。此外,Stringsealed,因此您无法通过继承来扩展它。唯一的办法是组合:在你自己的班级中封装string

答案 1 :(得分:2)

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

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

现在绑定到一组Company个对象; ToString覆盖将确保默认显示Name,您可以添加任何其他所需内容。对于更复杂的方案,您可以使用(例如)DisplayMemberValueMember(组合框)来指向不同的属性(而不是默认的ToString)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

    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();
    }

}