C# 通过确定POCO对象的名称,可以从Linq返回该对象的属性吗?

C# 通过确定POCO对象的名称,可以从Linq返回该对象的属性吗?,c#,linq,poco,fluent-interface,C#,Linq,Poco,Fluent Interface,基本概念是,我希望从签名方法中的输入获取“属性”返回。而不是财产背后的数据。例如:如果我选择“DEV”,我希望获得名为“DEV”的POCO类属性,而不是存储在POCO类的一部分中的数据 最终目标是创建一个SQL部署脚本生成器,其中环境在每个环境上可能有不同的命名数据库(请相信我,不是我的选择)。在这个例子中,它很简单,但在现实世界中,它并不像在任何名称后面附加“QA”或“UAT”这样的字符串那么简单。有人根本不遵循命名规则,只是随机命名,所以我找到并制作了一个集合,基本上会进行文本搜索、查找和替

基本概念是,我希望从签名方法中的输入获取“属性”返回。而不是财产背后的数据。例如:如果我选择“DEV”,我希望获得名为“DEV”的POCO类属性,而不是存储在POCO类的一部分中的数据

最终目标是创建一个SQL部署脚本生成器,其中环境在每个环境上可能有不同的命名数据库(请相信我,不是我的选择)。在这个例子中,它很简单,但在现实世界中,它并不像在任何名称后面附加“QA”或“UAT”这样的字符串那么简单。有人根本不遵循命名规则,只是随机命名,所以我找到并制作了一个集合,基本上会进行文本搜索、查找和替换。我正在制作一个包含不同名称的POCO对象。我意识到我可能必须规范化和更改对象,但我很好奇我是否可以在循环中找到POCO类的“属性”,而不必执行1、环境、名称、2、环境、名称等操作

代码:

命名空间SQL\u部署器
{
公共类数据库列表
{
公共字符串数据库名{get;set;}
公共字符串Dev{get;set;}
公共字符串演示{get;set;}
公共字符串QA{get;set;}
公共字符串UAT{get;set;}
公共字符串PROD{get;set;}
}
公共类数据库列表
{
受保护的静态列表数据库列表{get;set;}
公共数据库列表()
{
DataBaseListings=returnDatabaseListings();
}
私有列表returnDatabaseListings()
{
返回新列表{
新数据库清单{DatabaseName=“Main”,Dev=“Main”,DEMO=“MainDemo”,QA=“MainQA”,UAT=“MainUAT”,PROD=“MainPROD”},
新数据库清单{DatabaseName=“Sub”,Dev=“Sub”,DEMO=“SubDemo”,QA=“SubQA”,UAT=“SubUAT”,PROD=“subpd”}
};
}
}
}
命名空间SQL_部署器
{
公共类SQL_重写器:数据库列表
{
私有字符串_fileLocationSource;
私有字符串\u fileLocationTarget;
公共字符串FileTextOriginal;
公共字符串FileTextChanged;
公共SQL_重写器(字符串A源文件、字符串A目标文件)
{
_fileLocationSource=aSourceFile;
_fileLocationTarget=目标文件;
}
public void GetTextFromFile()
{
if(_fileLocationSource!=null)
FileTextOriginal=File.ReadAllText(_fileLocationSource).ToUpper();
其他的
FileTextOriginal=“无法读取”;
}
public void ChangeTextToNewFormat()
{
if(FileTextOriginal!=null)
{
List distinctEnvironments=新列表{“Dev”、“DEMO”、“QA”、“UAT”、“PROD”};
字典名称=新字典();
distinctEnvironments.ForEach(x=>
姓名。加入(
x,,
DataBaseListings.FirstOrDefault(y=>y.DatabaseName==“Review”).x//我希望对象的“property”扩展名与我在上面设置的“distinctEnvironments”列表匹配
)
);
//我现在应该为我的环境准备一个字典,其中包含我可以循环查找和替换文件中文本的每个环境“属性”。
foreach(名称中的变量替换)
{
FileTextOriginal.Replace(Replace.Key,Replace.Value);
//TODO将每个环境的文件写入主位置的子目录。
}
}
else if(FileTextOriginal==“无法读取”)
FileTextChanged=“无法读取输入”;
其他的
FileTextChanged=“没有要读取的有效输入”;
}
}
}

当然可以,使用反射:

var QAprop = typeof(DatabaseListing).GetProperty("QA");
或循环浏览所有属性:

foreach(var prop in typeof(DatabaseListing).GetProperties())
    string name = prop.Name;
从那里可以获得属性的类型、属性等

您必须再次使用反射来获取值:

distinctEnvironments.ForEach(x =>
    names.Add( 
        x,
        typeof(DatabaseListing).GetProperty(x)
                               .GetValue(DataBaseListings.FirstOrDefault(y => y.DatabaseName == "Review"), null) 
        )

谢谢,我知道你在使用反射。但是你能用反射来“选择”那个项目吗?我很想尝试:foreach(typeof(DatabaseListing).GetProperties(){FileTextChanged+=DataBaseListings.Where(x=>x.DatabaseName==“Main”).prop.GetConstantValue();}不,必须再次使用反射来获取属性的值。没有办法把一个变量替换成那样的属性调用。。。我现在看到你的更新了。我想错了。在与对象相关的GetProperty之后使用GetValue,然后将该对象与属性相关。谢谢。
distinctEnvironments.ForEach(x =>
    names.Add( 
        x,
        typeof(DatabaseListing).GetProperty(x)
                               .GetValue(DataBaseListings.FirstOrDefault(y => y.DatabaseName == "Review"), null) 
        )