【发布时间】:2017-04-24 05:36:31
【问题描述】:
不与this 重复。
我想让一个字符串有一个最大长度。它不应该超过这个长度。让我们说一个20个字符的长度。如果提供的字符串 > 20,则取前 20 个字符串并丢弃其余字符串。
The 对该问题的回答显示了如何使用函数为字符串加盖,但我想在没有函数的情况下直接执行此操作。我希望每次写入字符串时都进行字符串长度检查。
以下是我不想想做的事情:
string myString = "my long string";
myString = capString(myString, 20); //<-- Don't want to call a function each time
string capString(string strToCap, int strLen)
{
...
}
我可以通过一个属性来实现这一点:
const int Max_Length = 20;
private string _userName;
public string userName
{
get { return _userName; }
set
{
_userName = string.IsNullOrEmpty(value) ? "" : value.Substring(0, Max_Length);
}
}
然后我可以很容易地使用它来调用一个函数来限制它:
userName = "Programmer";
问题在于,我想限制的每个string 都必须为它们定义多个变量。在这种情况下,_userName 和 userName(属性)变量。
有什么聪明的方法可以做到这一点,而无需为每个字符串创建多个变量,同时不必在每次我想修改string 时调用函数?
【问题讨论】:
-
除了下面的答案之外,您还可以使用 PostSharp 等 AOP 框架来定义拦截您的属性设置器的属性。 PostSharp 有免费/特快版。
-
感谢您的建议。我正在使用 Unity3D 和 Mono,并试图防止使用会增加二进制大小或导致移动设备出现问题的第三方库。
-
不知道它是否有效,但 Unity 是否尊重 .NET 内置的
StringLengthAttribute? -
StringLength来自System.ComponentModel.DataAnnotations命名空间。这在 Unity 中不包含或不认可。这是 Unity 在其 .NET 3.5 中未包含的功能之一。