假设我创建了一个带有属性的类:
public class User { private string _userID; public string UserID { get { return _userID; } set { _userID = value; } } }
我必须如何处理类和属性才能将方法附加到UserID属性,例如使用"dot"语法围绕用户ID生成Xml的方法:
User u = new User(); u.UserID = "Mike"; string xml = u.UserID.ToXml();
我可以弄清楚如何编写一个方法来将Xml标记放在UserID的值周围,我想要的部分就是如何使用"dot"语法使该方法与属性一起使用.
所有这些答案都很有用,感谢大家的贡献.事实上,我标记为"被接受"的答案正是我所寻求的.我很欣赏扩展方法的注意事项(在此之前我从未听说过),当然在某些情况下将扩展方法应用于所有字符串可能会有问题,但在这种情况下我肯定想应用这个方法ToXml()到类中的所有字符串属性.正是医生所要求的.我对XmlSerialization非常熟悉,但在这种情况下需要避免它出于各种原因.
有两种方法:
您正在操作的对象/值必须具有该方法(例如,当您控制对象定义时).
public class UserIDObject { public string ToXML() {} } public class User { private UserIDObject _userID; public UserIDObject UserID { get { return _userID; } set { _userID = value; } } } User u = new User(); u.UserID = = new UserIDObject("Mike"); string xml = u.UserID.ToXml();
或者,您可以为对象实现扩展方法(MSDN).Geeks with blogs有一个很好的扩展方法教程,如果你运行的是VS2008,它们可以应用于.NET 2.0.
public static class MyMethods { public static string ToXML(this string s) { } }
扩展方法是您想要大量加权的东西,因为扩展方法适用于该类类型的所有对象.(IE.我希望所有字符串都能调用.ToXML()吗?)
你可以:
将_userID更改为自定义类,包装字符串并添加所需的方法.
为字符串类创建扩展方法(不推荐).这将影响所有字符串对象
您必须将该方法添加到属性的类型.在这种情况下,UserID是一个字符串,这意味着将其添加到字符串类型并使其可以从所有字符串访问.我不确定这是个好主意,但如果你真的想要这样做:
public static class StringUtils { public string ToXmlElement(this string s, string elementName) { return string.Format("<{0}>{1}{0}>", elementName, s); } }
这与您的函数签名不完全匹配,但它更适合附加到更大的字符串类.唯一的另一种选择是使用不同的底层类型来保存您的UserID,也许是一个隐式转换为字符串的自定义类.
最后,如果您只是尝试以通用方式将用户类编写为Xml,请查看System.Xml.Serialization
命名空间.然后你可以像这样标记你的类并使用XmlSerializer
实例来读或写类.
[Serializable] public class User { private string _userID; [XmlElement()] public string UserID { get { return _userID; } set { _userID = value; } } }