我正在使用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(){ }
}
答案 0 :(得分:2)
这里的主要问题是您不了解面向对象代码的工作方式。您没有使用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";
}
答案 1 :(得分:0)
根据我的评论,一个可能的解决方案:
将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";
}
}
}
答案 2 :(得分:0)
如果您主要关注的是设置位置值,如果为空,则设置硬编码值,那么请考虑以下解决方案:
private string _location;
public string Location
{
get { return _location; }
set
{
if (string.IsNullOrEmpty(value))
{
_location = "US";
}
else
{
_location = value;
}
}
}
答案 3 :(得分:0)
要回答您的问题:public void SetLocation(List<Employee> EmpList)
允许SetLocation()
中的代码访问列表对象(通过引用传递),但是我怀疑这是您真正想要做的。 (无罪;-)
您的逻辑不明确,但肯定在CreateEmpList()
内,
emp.Email = ...
if (emp.Email...) emp.Location = "..."
或在Employee
中,类似
public string Email { get {} set { Email = value; if (value...) Location = "..."; } }