具有不同设置和获取类型的访问器?

时间:2009-06-09 18:31:19

标签: c# variables types accessor

简单的问题,希望是一个简单的答案:

我想做以下事情:

private DateTime m_internalDateTime;
public var DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = value; } // here value is of type DateTime
}

以上只是我正在尝试做的一个例子。我想要一个x类型的内部变量的公共访问器。我希望将该变量作为字符串获取,但使用类型为x的东西设置它。

这可能吗?

- 编辑 -

我刚刚意识到我可以做类似的事情:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

但是,让我说使用y型而不是“string”作为我的'get'类型。如果我想在我的代码中使用“DateTimeProperty”,那么我必须使用它。

6 个答案:

答案 0 :(得分:10)

没有。显然,您可以在调用代码中添加.ToString(),但如果没有不同的名称,则无法执行您的建议:

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 

或者,甚至更好地使用方法而不是属性(如评论中所述):

private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }

请注意,var适用于隐式,编译时键入的 var iables,而不是动态变量。

绝对执行您在编辑中记下的内容。它引入了常规的中断,可能的性能影响(尽管是轻微的),以及显着的本地化问题。

答案 1 :(得分:5)

作为一种财产,不可能做到这一点。您可以创建不同类型的Get和Set方法,但对于属性,类型必须相同。

编辑:

虽然:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

在语法上是正确的,将编译并允许您接受DateTime作为输入并返回一个字符串,这不是一个好的计划。它有效,但它使您和任何人访问此代码,执行不需要的验证。此外,它将来很容易受到其他开发人员的攻击,不知道或者意识到隐藏的规则,因为您已经失去了编译时的安全性。此外,它几乎不再需要以强类型方式创建两个属性或两个实现相同目标的方法。

就个人而言,我建议使用两种方法(请参阅Jeff Yates的评论以获得有关原因的详细解释)。

private DateTime m_internalDateTime;
public string GetDateTime()
{
    return m_internalDateTime.ToString();
}

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}

答案 2 :(得分:3)

不是那样,但你肯定有第二个属性可以访问m_internalDateTime字段。

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}

答案 3 :(得分:3)

也许这有帮助

public class TDecimal
{
    private decimal? m_value;
    public bool HasValue { get { return m_value.HasValue; } }
    public decimal Value { get { return m_value.Value; } }

    public static implicit operator TDecimal(string a_value)
    {
        decimal d;
        if (decimal.TryParse(a_value, out d))
        {
            return new TDecimal() {m_value = d};
        }

        return new TDecimal() {m_value = null};
    }

    public static implicit operator decimal(TDecimal a_value)
    {
        if(a_value.HasValue)
        {
            return a_value.Value;
        }

        throw new ArgumentNullException("a_value");
    }
}

public class A
{
    public TDecimal Prop { get; set; }
}


A a = new A();

a.Prop = "123";
if (a.Prop.HasValue)
{
    decimal d = a.Prop;
}

答案 4 :(得分:0)

简单回答否,对于您的外部代码,您的属性将按照字段的确切方式运行,您不能拥有具有不同set / get类型的属性,就像您无法使用类型设置字段一样当你要求它的价值时,会得到不同的类型。

答案 5 :(得分:0)

怎么样:

private DateTime intDT;
public string DateTimeProperty
{   
      get { return intDT.ToString(); } // Return a string   
      set 
      { 
         DateTime dt;
         if (DateTime.TryParse(value, out dt))
             intDT = dt;
         else throw new ArgumentException(string.Format(
           "{0} cannot be converted to a DateTime.", value);           
      } 
}