无法访问对象初始值设定项内的属性

时间:2015-11-27 12:37:10

标签: c#

请考虑以下代码。

List<MyFiles> files = new List<MyFiles>();
....
while (reader.Read())
{
    var a = new MyFiles
    {
       FileName = reader["Filename"].ToString(),
       FileLocation = reader["Filelocation"].ToString(),
       FullPath = FileLocation + @"\" + FileName // Error at this line
    };
   files.Add(a);
}

上面是我的方法的一个片段,它使用SqlDataReader从数据库中获取数据。当我尝试为FullPath属性赋值时,一切正常。我收到以下错误消息:

  

非静态字段,方法或属性需要对象引用&#39; MyFiles.FileLocation&#39;   非静态字段,方法或属性&#39; MyFiles.FileName&#39;非常需要对象引用。

我知道我可以将这些属性设置为静态或创建实例并通过例如访问它们来访问它们。 var b = new MyFiles(); b.FileLocation ..

但我的问题是为什么我不能使用FileLocationFileName,因为我在上面的代码段中。有什么我想念的吗?

2 个答案:

答案 0 :(得分:5)

您无法访问刚刚初始化的实例的属性。

您可以使用本地变量:

int fileNameColumnOrdinal = reader.GetOrdinal("Filename");
int fileLocationColumnOrdinal = reader.GetOrdinal("Filelocation");
while (reader.Read())
{
    string fileName = reader.GetString(fileNameColumnOrdinal);
    string fileLocation = reader.GetString(fileLocationColumnOrdinal);
    var a = new MyFiles
    {
       FileName = fileName,
       FileLocation = fileLocation,
       FullPath = System.IO.Path.Combine(fileLocation, fileName)
    };
   files.Add(a);
}

我还建议使用System.IO.Path.Combine

答案 1 :(得分:3)

创建新对象并使用以下语法设置某些属性时:var foo = new bar { a = 123 };您只能设置属性,而不能使用它们。您必须使用一些辅助变量或通过以下方式设置属性:foo.a = 456;

解决方案1 ​​

List<MyFiles> files = new List<MyFiles>();
....
while (reader.Read())
{
    string fileName = reader["Filename"].ToString();
    string fileLocation = reader["Filelocation"].ToString();

    var a = new MyFiles
    {
       FileName = fileName,
       FileLocation = fileLocation,
       FullPath = fileLocation + @"\" + fileName // Error at this line
    };
   files.Add(a);
}

解决方案2

List<MyFiles> files = new List<MyFiles>();
....
while (reader.Read())
{
    var a = new MyFiles()

    a.FileName = reader["Filename"].ToString();
    a.FileLocation = reader["Filelocation"].ToString();
    a.FullPath = a.FileName + @"\" + a.FileLocation // Error at this line
   files.Add(a);
}

解决方案3

您可以为FullPath

创建自定义getter
public string FullPath
{
    get { return FileName + @"\" + FileLocation; }
}

修改

我认为这没有具体原因。它是设计的,所以一些c#开发人员认为,我们不需要这个:)我认为这是可能的,但只是没有实现。它应该是可能的,因为创建的IL-Code与我的解决方案2中的相同,它只是一些语法糖。