我正在使用C#。我有一个 Employee 类,我正在从 URL 获取员工数据,然后在另一个类中创建一个名为 EmpList 的列表,该类正在填充该信息。我没有获取每个员工的位置,所以我想通过在 Employee 类中创建设置位置函数来硬编码位置。 名称"EmpList"在当前上下文中不存在。
我尝试在 CreateEmpList 函数中制作 setLocation 函数,但没有收到错误,但位置为空。 我知道我可能正在做一些愚蠢的事情,但我真的需要一些帮助。我真的很感激。 谢谢。
这是我的员工班级。
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
public Guid ID { get; set; }
public string Location { get; set; }
public void SetLocation()
{
foreach (var item in EmpList) // I'm getting error here
{
if (item.Email == "abc@gmail.com")
{
item.Location = "US";
}
}
在这里,我将在另一个类中填充列表。
private List<Employee> EmpList = null;
private void CreateEmpList(SPHttpClient client)
{
List<Employee> SortedList = new List<Employee>();
JObject jsondata = client.ExecuteJson(UriResources);
string strjsondata = jsondata.First.First.First.First.ToString();
JArray jsonArray = JArray.Parse(strjsondata);
foreach (var item in jsonArray) // Creating master resources list
{
ResourcesExcemptList.ForEach(i => i.ToLower());
if(!ResourcesExcemptList.Contains(item["ResourceEmailAddress"].
ToString().ToLower()))
{
if (Boolean.Parse(item["ResourceIsActive"].ToString()))
{
Employee emp = new Employee();
emp.ID = (Guid)item["ResourceId"];
emp.Email = item["ResourceEmailAddress"].ToString();
emp.Name = item["ResourceName"].ToString();
emp.Practice = item["ResourceGroup"].ToString();
emp.ApproverID =
(Guid)item["ResourceTimesheetManageId"];
SortedList.Add(emp);
}
}
}
EmpList= SortedList.OrderBy(o => o.Name).ToList();
//private void setLocation(){ }
}
直接回答您的问题
这里的主要问题是你不了解面向对象代码是如何工作的。您没有使用this
,并且您似乎对何时执行类方法以及这意味着什么感到困惑。
奇怪的是,在类方法中,您仍然希望需要浏览列表才能找到正确的对象。 这与你应该如何处理它相反。
当执行对象的类方法时,您显然已经找到了要调用其方法的对象。因为否则您将无法调用该对象的类方法。
因此,您需要在这里做的是在调用对象的类方法之前迭代列表,而不是之后。您的Employee
类:
public void SetLocation()
{
this.Location = "US";
}
然后:
private void CreateEmpList(SPHttpClient client)
{
// the rest of the code
EmpList = SortedList.OrderBy(o => o.Name).ToList();
foreach(var employee in EmpList)
{
employee.SetLocation();
}
}
脚注
您的问题显示了对 OOP 原则的基本困惑,但代码本身显示了对 OOP 原则的不同程度的掌握。我怀疑这段代码不是你自己写的,而是同事写的。
我之所以提到这一点,是因为我注意到您的示例代码中的注释:
//private void setLocation(){ }
请注意,它的签名是方法定义的签名,而不是方法调用的签名!
我认为发生的事情是,您的同事注释了代码并提醒您创建一个方法,并且您最终在Employee
类中而不是在另一个类(其中具有CreateEmpList
方法的类(中实现了此方法。
在另一个类中创建该方法比将其放在Employee
类中更有意义。 大致如下:
public void SetLocation(Employee employee)
{
employee.Location = "US";
}
根据我的评论,一种可能的解决方案:
将EmpList
声明为:public List<Employee> EmpList { get; private set;}
然后在您的Employee
课上:
public void SetLocation()
{
var otherClassObj = new otherClassObj(); // Or perhaps some other way of getting the object of the other class.
otherClassObj.CreateEmpList(client); // You may have to change this.
foreach (var item in otherClassObj.EmpList)
{
if (item.Email == "abc@gmail.com")
{
item.Location = "US";
}
}
}
如果您的主要关注点是设置位置值,如果为空,则设置硬编码值,请考虑以下解决方案:
private string _location;
public string Location
{
get { return _location; }
set
{
if (string.IsNullOrEmpty(value))
{
_location = "US";
}
else
{
_location = value;
}
}
}
回答你的问题:public voidSetLocation(List<Employee> EmpList)
允许SetLocation()
中的代码访问列表对象(通过引用传递(,但我怀疑这是你真正想做的。 (没有冒犯;-(
你的逻辑不清楚,但肯定在CreateEmpList()
内,
emp.Email = ...
if (emp.Email...) emp.Location = "..."
或在Employee
内,类似
public string Email { get {} set { Email = value; if (value...) Location = "..."; } }