Je travaille avec C #. J'ai une classe Employee et j'obtiens les données des employés à partir d'une URL, puis j'ai créé une liste nommée EmpList dans une autre classe qui est remplie avec ces informations. Je n'obtiens pas l'emplacement de chaque employé, je souhaite donc coder l'emplacement en définissant une fonction d'emplacement dans la classe Employé. Le nom 'EmpList' n'existe pas dans le contexte actuel.
J'ai essayé de créer la fonction setLocation dans la fonction CreateEmpList et je n'ai eu aucune erreur mais l'emplacement était vide. Je sais que je fais probablement quelque chose de stupide mais j'ai vraiment besoin d'aide ici. J'apprécie vraiment ça. Merci.
Ceci est ma classe d'employés.
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(){ }
}
Et ici, je remplis la liste dans une autre classe.
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";
}
}
4 Réponses :
Une solution possible, basée sur mes commentaires:
Déclarez EmpList comme:
public List
Puis dans votre classe 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";
}
}
}
Si votre principale préoccupation est de définir la valeur de l'emplacement et si elle est vide, définissez la valeur du code en dur, alors envisagez cette solution:
private string _location;
public string Location
{
get { return _location; }
set
{
if (string.IsNullOrEmpty(value))
{
_location = "US";
}
else
{
_location = value;
}
}
}
Pour répondre à votre question: public void SetLocation (List permet au code à l'intérieur de SetLocation () d'accéder à l'objet de liste (passé par référence) mais Je doute que ce soit ce que vous voulez vraiment faire. (Aucune infraction ;-)
Votre logique n'est pas claire mais sûrement dans CreateEmpList(),
public string Email { get {} set { Email = value; if (value...) Location = "..."; } }
ou dans Employee , quelque chose comme
emp.Email = ... if (emp.Email...) emp.Location = "..."
Le principal problème ici est que vous ne comprenez pas comment fonctionne le code orienté objet. Vous n'utilisez pas this , et vous semblez ne pas savoir quand la méthode de classe sera exécutée et ce que cela signifie.
Curieusement, quand dans une méthode de classe, vous attendez toujours que vous devez parcourir la liste pour trouver le bon objet. C'est le contraire de la façon dont vous devriez l'aborder.
Lors de l'exécution de la méthode de classe d'un objet, vous avez évidemment déjà trouvé l'objet dont vous voulez appeler la méthode . Parce que sinon, vous n'auriez pas pu appeler la méthode de classe de cet objet.
Donc, ce que vous devez faire ici est d'itérer sur la liste avant d'appeler la méthode de classe de l'objet , pas après. Votre classe Employee :
public void SetLocation(Employee employee)
{
employee.Location = "US";
}
Et puis:
//private void setLocation(){ }
Votre question montre une confusion de base sur les principes de la POO, mais le code lui-même montre un niveau différent de compréhension des principes de la POO. Je soupçonne que vous n'avez pas écrit ce code vous-même, mais un collègue l'a fait.
Je le mentionne parce que j'ai remarqué le commentaire dans votre exemple de code:
private void CreateEmpList(SPHttpClient client)
{
// the rest of the code
EmpList = SortedList.OrderBy(o => o.Name).ToList();
foreach(var employee in EmpList)
{
employee.SetLocation();
}
}
Ouais je travaillais sur le code de mon collègue. J'étais confus dans un concept, maintenant je l'ai clair. Merci beaucoup pour votre aide :)
Vous devez rendre
EmpListdisponible en dehors de la classe dans laquelle vous l'avez défini - soit en utilisant une propriété ou une méthode, selon votre cas. Ce n'est qu'alors que vous pourrez y accéder dans la classeEmployee.@AnoopRDesai J'ai créé une propriété
public List EmpList {get; ensemble privé; } mais à l'emplacement j'obtiens null.Oui, vous devez avoir appelé
CreateEmpList ()avant d'y accéder dans la classeEmployee.Heureux d'aider! :)