Hopefully this makes sense. I have a class named ShippingCont
In this class, I have a LINQ connection like below. I want to be use this class to call the given table and get all the necessary fields instead of calling individual queries to the DB.
public static ShippingContainerDataContext shippingContainer = new ShippingContainerDataContext();
public static SHIPPING_CONTAINER sc2 = shippingContainer.SHIPPING_CONTAINERs.FirstOrDefault(a => a.CONTAINER_ID == _externalContainerId);
private string _containerId = sc2.COMPANY;
private string _company = sc2.COMPANY;
public string fromProgram
{
get { return _externalContainerId; }
}
public string ContId
{
get { return sc2.CONTAINER_ID; }
set { _externalContainerId = value; }
}
public string _ContainerId
{
get { return sc2.CONTAINER_ID; }
set { _ContainerId = value; }
}
public string _Company
{
get { return sc2.COMPANY; }
set { _company = value; }
}
When I try to pass a value to the _externalContainerId in the class. The LINQ query returns no records and I get the error Object reference not set to an instance of an object.
I know the LINQ returns data because when I manually provide the container ID in the LINQ query like (see below), I get a result set.
public static SHIPPING_CONTAINER sc2 = shippingContainer.SHIPPING_CONTAINERs.FirstOrDefault(a => a.CONTAINER_ID == "00008878742000004419");
The value is being pass from the main program like below.
ShippingCont sc = new ShippingCont("00008878742000004419");
I know the value is being passed because when I call the fromProgram() the value prints.
What am I doing wrong?
Since sc2 is static, the query is probably running before _externalContainerId is set (_externalContainerId = null), which would return empty. It would then remain empty for the duration of the program, because it is not getting recalculated, causing an error when you try to access a member. Since you are setting _externalContainerId in the constructor, you might place the assignment of sc2 in there as well. E.g.
public ShippingCont(string id)
{
this._existingContainerId = id;
sc2 = shippingContainer.SHIPPING_CONTAINERs.FirstOrDefault(a => a.CONTAINER_ID == _externalContainerId);
}
public static ShippingContainerDataContext shippingContainer = new ShippingContainerDataContext();
public SHIPPING_CONTAINER sc2;
private string _containerId = sc2.COMPANY;
private string _company = sc2.COMPANY;
public string fromProgram
{
get { return _externalContainerId; }
}
public string ContId
{
get { return sc2.CONTAINER_ID; }
set { _externalContainerId = value; }
}
public string _ContainerId
{
get { return sc2.CONTAINER_ID; }
set { _ContainerId = value; }
}
public string _Company
{
get { return sc2.COMPANY; }
set { _company = value; }
}
Related
So i have nested type classes that go something like this:
namespace MyNamespace
{
public class User
{
private int id = 0;
private string userId = "";
private string userPassword = "";
public int Id
{
get { return id; }
set { id = value; }
}
public string UserId
{
get { return userId; }
set { userId = value; }
}
public string UserPassword
{
get { return userPassword; }
set { userPassword = value; }
}
public User()
{
id = 0;
userId = "";
userPassword = "";
}
public static class SignonInfo
{
private static string sesstoken = "";
private static DateTime sessstart = new DateTime();
public static string SessToken
{
get { return sesstoken; }
set { sesstoken = value; }
}
public static DateTime SessStart
{
get { return sessstart; }
set { sessstart = value; }
}
}
}
}
My end goal here was to be able to access the nested static class like this:
User user = new User();
string token = user.SignonInfo.SessToken;
I'm trying to avoid instantiating the class like this:
User.SignonInfo user = new User.SignonInfo()
I need to be able to access properties of both User and SignonInfo classes.
Could someone help me to get on track or slap me about and tell me i'm doing it all wrong?
TIA
The problem is that it's a static class, so an "instance" doesn't have access to it. This is a good thing, as it prevents global state from masquerading as a well-encapsulated object.
I'd suggest making the nested class non-static, and having theUser class create an instance as needed by the caller (maybe add a public SignonInfo GetSignonInfo() method.)
You are trying to access your nested class as if it were a member of the instance of the outer class.
Change
string token = user.SignonInfo.SessToken;
to
User.SignonInfo.SessToken;
Note, that you do not get an instance of the static nested type per outer instance, there is only one for the entire outer class.
please tell me how can i call only the get method of this property in another method .
for example
public List<EmployeeData> LOP
{
get
{
if (_lop == null)
{
_lop = new List<DTPackage>();
}
return _lop;
}
set
{
_lop = value;
}
}
i want to call only get method of this property.
public List<EmployeeData> LOP
{
get
{
if (_lop == null)
{
_lop = new List<DTPackage>();
}
return _lop;
}
set
{
_lop = value;
}
}
var lop = LOP; // here POP get will be called
LOP = myEmployeeList //here POP set will be called
You can make set to private to avoid access from other classes or remove set for readonly
These are all compilable variants of .Net properties:
// Shorthand
public string MyProperty1 { get; set; }
public string MyProperty2 { get; private set; }
public string MyProperty3 { get; }
// With backing field
private string _myProperty4;
private string _myProperty5;
private readonly string _myProperty6;
public string MyProperty4
{
get { return _myProperty4; }
set { _myProperty4 = value; }
}
public string MyProperty5
{
get { return _myProperty5; }
private set { _myProperty5 = value; }
}
public string MyProperty6
{
get { return _myProperty6; }
}
MSDN
Usage:
string myString = MyProperty4; // Calls get on MyProperty4
MyProperty4 = "Hello World" // Calls set on MyProperty4
MyProperty6 = "Hello World" // Will not be compilable
I have a customer object class:
public class customerObject
{
private string _address1;
private string _address2;
private string _address3;
private string _category;
private string _country;
private string _county;
private string _custcode;
private string _fullname;
private string _int_rep_hou;
private string _int_rep_key;
private double _lat;
private double _lng;
private string _postcode;
private string _rep_code;
private string _telephone;
public customerObject()
{
}
public string Address1
{
get { return _address1; }
set { _address1 = value; }
}
public string Address2
{
get
{
return _address2;
}
set { _address2 = value; }
}
public string Address3 { get { return _address3; } set { _address3 = value; } }
public string Category
{
get { return _category; }
set { _category = value; }
}
public string Country { get { return _country; } set { _country = value; } }
public string County { get { return _county; } set { _county = value; } }
public string Custcode
{
get { return _custcode; }
set { _custcode = value; }
}
public string Fullname
{
get { return _fullname; }
set { _fullname = value; }
}
public string Int_rep_hou
{
get { return _int_rep_hou; }
set { _int_rep_hou = value; }
}
public string Int_rep_key
{
get { return _int_rep_key; }
set { _int_rep_key = value; }
}
public double Lat { get { return _lat; } set { _lat = value; } }
public double Lng { get { return _lng; } set { _lng = value; } }
public string Postcode { get { return _postcode; } set { _postcode = value; } }
public string Rep_code
{
get { return _rep_code; }
set { Rep_code = value; }
}
public string Telephone { get { return _telephone; } set { _telephone = value; }
}
}
I have a CustomCollections class
public class CustomerCollection
{
public List<customerObject> Customers { get; set; }
}
My method that loops through dt rows and converts to a customer object
public List<Valueobjects.CustomerCollection> dolist(DataTable temptablename)
{
//Create Collection Object
Valueobjects.CustomerCollection Collection = new Valueobjects.CustomerCollection();
foreach (DataRow row in temptablename.Rows)
{
//Create Customer Object
Valueobjects.customerObject Customer = new Valueobjects.customerObject();
//set values of customer object
Customer.Rep_code = "";
Customer.Int_rep_key = "";
Customer.Int_rep_hou = "";
Customer.Fullname = row["Fullname"].ToString().Trim();
Customer.Custcode = row["Custcode"].ToString().Trim();
Customer.Category = row["Category"].ToString().Trim();
Customer.Address1 = row["Address1"].ToString().Trim();
Customer.Address2 = row["Address2"].ToString().Trim();
Customer.Address3 = row["Address3"].ToString().Trim();
Customer.Postcode = row["Postcode"].ToString().Trim();
Customer.Country = row["Country"].ToString().Trim();
Customer.Telephone = row["Telephone"].ToString().Trim();
Customer.Lat = Convert.ToDouble(row["Lat"]);
Customer.Lng = Convert.ToDouble(row["Lng"]);
Customer.County = row["County"].ToString().Trim();
//add to the collection (list)
Collection.Customers.Add(Customer);
}
temptablename = null;
return Collection;
}
However when I create a new Customer object and a new CustomerCollection object I am getting an error when adding the customer to the collection list.
Error:
Error 32 Cannot implicitly convert type
'Classes.Valueobjects.CustomerCollection' to
'System.Collections.Generic.List'
Your method is returning a List<CustomerCollection>:
public List<Valueobjects.CustomerCollection> dolist(DataTable temptablename)
{
//...
}
But the code is trying to return a CustomerCollection:
return Collection;
Just as the error says, these two types are different.
If a CustomerCollection is already a collection of customers, then semantically what is a List<Valueobjects.CustomerCollection>? A collection of collections? It seems like you're over-pluralizing your objects :)
There are two approaches here. Either return a CustomerCollection from the method:
public CustomerCollection dolist(DataTable temptablename)
{
//...
}
Or use a List<Customer> if you want to use generic lists as your collection containers:
public List<Customer> dolist(DataTable temptablename)
{
//...
var Collection = new List<Customer>();
//...
Collection.Add(Customer);
//...
return Collection;
}
Side note: You may want to stick to C# conventions for variable naming. As you can see from the code highlighting here on Stack Overflow, your variable names can easily be mistaken for classes/types, which can cause confusion when supporting the code.
Return a CustomerCollection instead of a List<Valueobjects.CustomerCollection>:
public Valueobjects.CustomerCollection Dolist(DataTable temptablename)
{
// ...
Your object has a list, it is not a list.
MSDN: Inheritance
i want to cast a string from database to a class object without having to go over each possible outcome.
so not
if(type.StartsWith("ContactPersonType")){//} else if(type.StartsWith("ContactPersonTitle")){//}
this is what i have so far
private static T Create<T>(IDataRecord record)
{
var properties = typeof(T).GetProperties();
var returnVal = Activator.CreateInstance(typeof(T));
properties.ToList().ForEach(item =>
{
string type = item.GetMethod.ReturnParameter.ParameterType.Name;
if (type.StartsWith("ContactPerson"))
{
Type t = Type.GetType(item.GetMethod.ReturnParameter.ParameterType.ToString());
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), t));
}
else if (!type.StartsWith("ObservableCollection"))
{
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), item.PropertyType));
}
});
return (T)returnVal;
}
public class ContactPersonType
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private String _name;
public String Name
{
get { return _name; }
set { _name = value; }
}
}
thanks
Use an anonymous collection when you want a certain action to apply to different input values.
foreach(var option in new[] {"ContactPerson", "ContactPersonTitle" }){
if (type.StartsWith(option))
{
Type t = Type.GetType(item.GetMethod.ReturnParameter.ParameterType.ToString());
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), t));
}
}
I have a DisplayedData class ...
public class DisplayedData
{
private int _key;
private String _username;
private String _fullName;
private string _activated;
private string _suspended;
public int key { get { return _key; } set { _key = value; } }
public string username { get { return _username; } set { _username = value; } }
public string fullname { get { return _fullName; } set { _fullName = value; } }
public string activated { get { return _activated; } set { _activated = value; } }
public string suspended { get { return _suspended; } set { _suspended = value; } }
}
And I want to to put the objects from this class into an array where all objects inside of this class should be converted into an String[]
I have..
DisplayedData _user = new DisplayedData();
String[] _chosenUser = _user. /* Im stuck here :)
or can I create an array where all the items inside are consist of variables of different datatype so that the integer remains an integer and so the strings too?
You can create an array "with your own hands" (see Arrays Tutorial):
String[] _chosenUser = new string[]
{
_user.key.ToString(),
_user.fullname,
_user.username,
_user.activated,
_user.suspended
};
Or you could use Reflection (C# Programming Guide):
_chosenUser = _user.GetType()
.GetProperties()
.Select(p =>
{
object value = p.GetValue(_user, null);
return value == null ? null : value.ToString();
})
.ToArray();