|
Hi Harold,
Thanks a lot, so sounds like, I will have to use a method within a FieldInfo where the passing argument will be the name of the field "ID" in this case, right ? If so, then, yes, this solution is not useful, because as you said, I will have to know the name "ID" before I can get it from FieldInfo. Is not there any other solution which can give me the result "ID" from the passing object without passing the string "ID" ?
|
|
|
|
|
There can be, will ID be the only field? Or will there be some other distinguishing feature about it, such as ID being the only field of type Int32 ?
|
|
|
|
|
Hi Harold,
Thanks for the reply again. No, there could be more integers in the Demo class. But I want to pass the object to a method where the method needs to extract the name of this object "ID" in this case from reflection without asking any more information. So, sounds like, I cannot do that with .NET 4. Anyway, thanks a lot for your suggessions.
|
|
|
|
|
I don't think you could do it at all, not even theoretically, how would you know which field to choose?
Would a custom attribute to mark it be an option?
|
|
|
|
|
Hi Harold,
No, the object is actually a LINQ to SQL Model, so I cannot add custom attribute (unless I dont want to re build the LINQ to SQL Classes by Visual Studio). So, I give up Thanks again.
|
|
|
|
|
If this field is primary key and you're using LINQ to SQL, then check ColumnAttribute (you can view it by opening source file generated by LINQ to SQL engine). There's a property IsPrimaryKey, which may be useful to you.
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
|
|
|
|
|
Basically you can't. You could override the ToString method of Demo to return "ID" though.
|
|
|
|
|
Hi,
Yes, thats what I see, I can't get this information. I hope future version of .NET will allow us to do that.
|
|
|
|
|
You can hope all you want; it ain't gonna happen.
|
|
|
|
|
And what about this:
Demo demo = new Demo();
demo.ID = 1;
demo.Name = "Demo";
foreach ( Fi in demo.GetType.GetFields(BindingFlags.Public | BindingFlags.Instance)) {
Console.WriteLine("--" + Fi.Name);
}
gives you "ID" and "Name".
|
|
|
|
|
And to get the value for ID and Name :
Fi.GetValue(demo);
|
|
|
|
|
You need to use Linq Expression objects to get the name of a property, from the property itself. Here's a simple test program that demonstrates what you have to do:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Consumer c = new Consumer();
c.TestIt();
}
}
public class Demo
{
public int InstanceProperty { get; set; }
public string InstanceField;
static public int TypeField;
static public int TypeProperty { get; set; }
}
public class Consumer
{
public void TestIt()
{
button1_click(this, new EventArgs());
}
private void button1_click(object sender, EventArgs e)
{
Demo myDemo = new Demo { InstanceProperty = 10, InstanceField = "Kab" };
string n1 = GetMemberName(() => myDemo.InstanceField);
string n2 = GetMemberName(() => myDemo.InstanceProperty);
string n3 = GetMemberName(() => Demo.TypeField);
string n4 = GetMemberName(() => Demo.TypeProperty);
string n5 = GetMemberName(() => myDemo);
}
private string GetMemberName<T>(Expression<Func<T>> itemSpecifierExpression)
{
var bodyAsMemberExpression = itemSpecifierExpression.Body as MemberExpression;
if (bodyAsMemberExpression == null)
throw new ArgumentException("itemSpecifierExpression does not specify an object or an instance or type member");
var propInfo = bodyAsMemberExpression.Member as MemberInfo;
return bodyAsMemberExpression.Member.Name;
}
}
} Note - it may be possible to simplify things a bit, but I've not used Expression enough to be sure.
See INotifyPropertyChanging[^] by atverma[^] for the article where I first saw the technique used.
|
|
|
|
|
|
|
|
hello
For WCF host instantiated and opened programmatically - how to relate to binding in app.config? For example, here we get the channel open:
using (ServiceHost host = new ServiceHost(typeof(GridControllerService)))
{
System.ServiceModel.WSDualHttpBinding binding = new WSDualHttpBinding();
binding.OpenTimeout = new TimeSpan(3, 0, 0);
binding.CloseTimeout = new TimeSpan(3, 0, 0);
binding.SendTimeout = new TimeSpan(3, 0, 0);
binding.ReceiveTimeout = new TimeSpan(3, 0, 0);
binding.MaxBufferPoolSize = 5000;
host.AddServiceEndpoint(typeof(IGridControllerService), binding, "wsDualHttpBinding");
host.Open();
But instead of programmatically code up the binding config, we code have relate it to what's already in app.config
<system.serviceModel>
<bindings>
<wsDualHttpBinding>
<binding name="SomeHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
transactionFlow="false"
....
In this case, how can I relate "host" instantiated programmatically (yes weird why not do the whole deal in config right? But that's not my question) to "SomeHttpBinding" in config file.
Thanks
|
|
|
|
|
hello!
I have a following string.
string str="flower pot";
In above string i want to replace the position of the character.
eg: "o" replace with its just next character.
my new string is shown like:
"flwoer pto"
thanx
|
|
|
|
|
public void RelocateChar(ref string text, int pos1, int pos2)
{
char[] supportArray = text.ToCharArray();
char supportChar;
supportChar = supportArray[pos2];
supportArray[pos2] = supportArray[pos1];
supportArray[pos1] = supportChar;
text = new string(supportArray);
}
Maybe there are better solutions, but this one should work.
|
|
|
|
|
Have a look through this code and see whether it solves your problem.
private void button1_Click(object sender, EventArgs e)
{
string str = "flower pot";
MessageBox.Show("The source string " + str + System.Environment.NewLine + System.Environment.NewLine + "The Replace Content " + SwapCharacters(str, 'o'));
}
public string SwapCharacters(string strSrc, char chrSrc)
{
string strDst = string.Empty;
try
{
while (strSrc.IndexOf(chrSrc) > -1)
{
strDst += strSrc.Substring(0, strSrc.IndexOf(chrSrc));
strDst += strSrc.Substring(strSrc.IndexOf(chrSrc) + 1, 1);
strDst += chrSrc;
strSrc = strSrc.Substring(strSrc.IndexOf(chrSrc) + 2);
}
strDst += strSrc;
}
catch (Exception ex)
{
throw ex;
}
return strDst;
}
|
|
|
|
|
Hi,
I've a function tht converts IEnumerable To DataTable,
my problem is that one off the columns allowes Nullable
and then i get this exception-
DataSet does not support System.Nullable <>
here is part of my function-
foreach (PropertyInfo pi in pis)<br />
{<br />
<br />
if (dt.Columns.Count == 0)<br />
{<br />
foreach (PropertyInfo pi in pis)<br />
{<br />
dt.Columns.Add(pi.Name, pi.PropertyType);<br />
}<br />
}
i tried to change the function to-
if (dt.Columns.Count == 0)<br />
{<br />
foreach (PropertyInfo pi in pis)<br />
{<br />
Type propType = pi.PropertyType;<br />
if (propType.IsGenericType && propType. == typeof(System.Nullable))<br />
{<br />
propType = Nullable.GetUnderlyingType(propType);<br />
<br />
}<br />
<br />
dt.Columns.Add(pi.Name, pi.PropertyType);<br />
}<br />
}
but i'm still getting the exception:
+ pi {System.Nullable`1[System.DateTime] "myColumnName"} System.Reflection.PropertyInfo {System.Reflection.RuntimePropertyInfo}
What i'm doing wrong?
|
|
|
|
|
treuveni wrote: What i'm doing wrong?
...
dt.Columns.Add(pi.Name, pi.PropertyType);
Guess you wanted to use propType instead of pi.PropertyType ?
|
|
|
|
|
Hi,
I am getting the same error. Did you figure it out? If so, can you please let me know.
Thanks in advance.
Ken
|
|
|
|
|
How can I check SD card is broken?
|
|
|
|
|
Stick it into the SD card slot. Can you read it?
"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair.
nils illegitimus carborundum
me, me, me
|
|
|
|
|