How can I get the name of the object from Reflection ?
-
Hello, I need to get the name of the Object using Reflection, but I am getting all information about how to get the name of the Type using Reflection rather than the Object. For example, I got the following code,
public class Demo
{
public int ID { get; set; }
public string Name { get; set; }
}private void button1_Click(object sender, EventArgs e)
{
Demo myDemo = new Demo {ID = 10, Name = "Kab"};var theType = myDemo.ID.GetType(); MessageBox.Show(theType.Name);
}
When I click the button1, The message box shows "
Int32
", but I need to see "ID
". Would you please tell me how I can achieve this goal! Regards. -
Hello, I need to get the name of the Object using Reflection, but I am getting all information about how to get the name of the Type using Reflection rather than the Object. For example, I got the following code,
public class Demo
{
public int ID { get; set; }
public string Name { get; set; }
}private void button1_Click(object sender, EventArgs e)
{
Demo myDemo = new Demo {ID = 10, Name = "Kab"};var theType = myDemo.ID.GetType(); MessageBox.Show(theType.Name);
}
When I click the button1, The message box shows "
Int32
", but I need to see "ID
". Would you please tell me how I can achieve this goal! Regards.The Type object for the ID field has no knowledge of the Demo class. If you want to get the name "ID" you will have to do it through the type object of Demo, and get a FieldInfo of the field ID. The property Name of that FieldInfo object will hold the string "ID". That does not sound very useful to me though, because you already had to know that the field is called ID to find it in the first place.
-
The Type object for the ID field has no knowledge of the Demo class. If you want to get the name "ID" you will have to do it through the type object of Demo, and get a FieldInfo of the field ID. The property Name of that FieldInfo object will hold the string "ID". That does not sound very useful to me though, because you already had to know that the field is called ID to find it in the first place.
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" ?
-
Hello, I need to get the name of the Object using Reflection, but I am getting all information about how to get the name of the Type using Reflection rather than the Object. For example, I got the following code,
public class Demo
{
public int ID { get; set; }
public string Name { get; set; }
}private void button1_Click(object sender, EventArgs e)
{
Demo myDemo = new Demo {ID = 10, Name = "Kab"};var theType = myDemo.ID.GetType(); MessageBox.Show(theType.Name);
}
When I click the button1, The message box shows "
Int32
", but I need to see "ID
". Would you please tell me how I can achieve this goal! Regards.Basically you can't. You could override the ToString method of Demo to return "ID" though.
-
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.
-
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.
-
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.
-
Hello, I need to get the name of the Object using Reflection, but I am getting all information about how to get the name of the Type using Reflection rather than the Object. For example, I got the following code,
public class Demo
{
public int ID { get; set; }
public string Name { get; set; }
}private void button1_Click(object sender, EventArgs e)
{
Demo myDemo = new Demo {ID = 10, Name = "Kab"};var theType = myDemo.ID.GetType(); MessageBox.Show(theType.Name);
}
When I click the button1, The message box shows "
Int32
", but I need to see "ID
". Would you please tell me how I can achieve this goal! Regards. -
-
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.
-
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.
-
Hello, I need to get the name of the Object using Reflection, but I am getting all information about how to get the name of the Type using Reflection rather than the Object. For example, I got the following code,
public class Demo
{
public int ID { get; set; }
public string Name { get; set; }
}private void button1_Click(object sender, EventArgs e)
{
Demo myDemo = new Demo {ID = 10, Name = "Kab"};var theType = myDemo.ID.GetType(); MessageBox.Show(theType.Name);
}
When I click the button1, The message box shows "
Int32
", but I need to see "ID
". Would you please tell me how I can achieve this goal! Regards.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); // This was a surprise - I expected it to fail! } 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.