0

我看过一些帖子说扩展构造函数不存在,但我想知道是否有另一种方法可以实现这一点。

从本质上讲,我的任务是构建一系列 Web 服务(作为消息代理),其中可能会将完整的信用卡详细信息传递到任何文本字段中。

我遇到的问题是,无论有人在哪个字段输入完整的信用卡号(有意或无意),我都需要确保在允许数据被使用或去任何地方之前适当地混淆数据。

我认为,如果我可以修改字符串对象的默认行为以在实例化它们时执行此检查,而不是编写一大堆显式调用,并且可能在过程中丢失字段,那将是很棒的。那么就没有任何数据泄漏的机会。

忽略这种方法的潜在性能问题,有没有办法真正实现这一点?

4

2 回答 2

3

System.Security.SecureString 类

http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx

于 2013-04-02T23:59:15.687 回答
0

最后,我选择了@sambomartin 建议的方法

我生成了一个不同的类来将字符串封装在对象的属性中。

真正的诀窍是隐式运算符覆盖。再加上一些与字符串实现相同的接口,这使我能够创建一个(到目前为止)在代码中运行得相当顺畅的类。

public class MyString : IComparable, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
{
    #region Static Operators
    public static implicit operator MyString(string value)
    {
        return new MyString(value);
    }

    public static implicit operator string(MyString value)
    {
        return value.value;
    }

    public static bool operator !=(MyString a, MyString b)
    {
        return a.value != b.value;
    }

    public static bool operator ==(MyString a, MyString b)
    {
        return a.value == b.value;
    }

    public static bool operator !=(MyString a, string b)
    {
        return a.value != b;
    }

    public static bool operator ==(MyString a, string b)
    {
        return a.value == b;
    }

    public static bool operator !=(string a, MyString b)
    {
        return a != b.value;
    }

    public static bool operator ==(string a, MyString b)
    {
        return a == b.value;
    }
    #endregion

    private string value;

    public int Length
    {
        get { return (value != null) ? value.Length : 0; }
    }

    public MyString(string value)
    {
        this.value = PciCleaner.Clean(value);
    }

    #region Object Overrides
    public override string ToString()
    {
        return value;
    }

    public override bool Equals(object obj)
    {
        return (value != null) ? value.Equals(obj) : false;
    }

    public override int GetHashCode()
    {
        return (value != null) ? value.GetHashCode() : new object().GetHashCode();
    }
    #endregion

    #region IComparable
    public int CompareTo(object obj)
    {
        return (value != null) ? value.CompareTo(obj) : -1;
    }
    #endregion

    #region IComparable<string>
    public int CompareTo(string other)
    {
        return (value != null) ? value.CompareTo(other) : -1;
    }
    #endregion

    #region IEnumerable<char>
    public IEnumerator<char> GetEnumerator()
    {
        return (value != null) ? value.GetEnumerator() : null;
    }
    #endregion

    #region IEnumerable
    IEnumerator IEnumerable.GetEnumerator()
    {
        return (value != null) ? (value as IEnumerable).GetEnumerator() : null;
    }
    #endregion

    #region IEquatable<string>
    public bool Equals(string other)
    {
        return (value != null) ? value.Equals(other) : false;
    }
    #endregion
}
于 2013-04-05T09:13:14.860 回答