具有不同 set 和 get 类型的访问器?

问题描述 投票:0回答:7

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

我想做以下事情:

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 而不是“字符串”作为我的“获取”类型。如果我想在代码中的其他位置使用“DateTimeProperty”,我必须强制转换它。

c# variables types accessor
7个回答
14
投票

不。显然,您可以在调用代码中添加 .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可变量,而不是动态变量。

绝对不要做您在编辑中注明的事情。它打破了惯例,可能对性能产生影响(尽管很小),以及严重的本地化问题。


7
投票

作为财产,这是不可能的。您可以创建不同类型的 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;
}

6
投票

也许有帮助

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
投票

不是这样,但您当然可以有第二个属性来访问 m_internalDateTime 字段。

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

0
投票

简单的回答:不,对于您的外部代码,您的属性的行为方式与字段完全相同,您不能拥有具有不同设置/获取类型的属性,就像您不能使用类型设置字段一样您请求它的值得到不同类型的返回。


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

0
投票

正如一些答案建议使用两种方法,我解决了此类问题,但仅使用一种方法,因为 C# 方法可以具有任何类型的参数和返回类型:

private DateTime m_internalDateTime; 
public string MyDateTime(DateTime dateTime=null) 
{ 
  if(dataTime != null) m_internalDateTime = dateTime; 
  return m_internalDateTime; 
}

因此,如果有任何参数,请按照属性“Set”中的方式对其进行分配,忽略“Set”的返回也没有什么问题。无论如何,它的行为都是“获取”。

© www.soinside.com 2019 - 2024. All rights reserved.