类的属性赋值问题?

忆水思寒 2020-06-28 05:49:30
想动态给类的属性赋值,请问该怎么写


people p=new pelple();
Type t = p.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
object value1 = pi.GetValue(phoneCaptchaLog, null);//用pi.GetValue获得值
if(people[name]== pi.Name)//这段该怎么写
{
people[name]=value1;
}
}
...全文
1306 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
引用 8 楼 正怒月神 的回复:
不需要整反射这套东西。
版主我的意思你可能没理解清楚,如你代码,假如main中有个变量叫PropertyName,它对应的值的string可能是id,name,age其中一项,那你怎么能根据它的值来用Test对应的属性接收呢
圣殿骑士18 2020-06-29
  • 打赏
  • 举报
回复
3楼标准答案,什么[]这种索引器,要不要实现关系不大,你自己实现一个都行。
正怒月神 版主 2020-06-29
  • 打赏
  • 举报
回复
引用 7 楼 忆水思寒 的回复:
有的属性想要赋值,有的不想,想赋值的属性要根据上面传来的值来确定哪个属性 直接写不行,不行
那你直接修改 属性的get;set;方法就好了。 不需要整反射这套东西。 测试代码:
static void Main(string[] args)
        {
            Test t = new Test();
            t.Id = 1;
            t.Age = 10;
            t.Name = "test";

            Test t1 = new Test();
            t1.Id = 2;
            t1.Age = 120;
            t1.Name = "hello";

            Console.ReadLine();
        }

        public class Test
        {
            private int id;
            private string name;
            private int age;

            public int Id { get => id; set => id = value; }

            public string Name
            {
                get => name;
                set
                {
                    if (value !="test") name = value;
                    else Console.WriteLine("name=test");
                }
            }

            public int Age { 
                get => age; 
                set {
                    if (value > 15) age = value;
                    else Console.WriteLine("age<=15");
                } 
            }
        }
结果:
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
有的属性想要赋值,有的不想,想赋值的属性要根据上面传来的值来确定哪个属性 直接写不行,不行
正怒月神 版主 2020-06-29
  • 打赏
  • 举报
回复
别整这个类了。 其实根本不通用。 我们说说实际需求吧。 你要做什么呢?拿到个类,然后通过传递不同属性名,完成赋值? 那还不如直接 xxx.属性=值 来的快。
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
这个name还不能写死,写死就不通用了,最好更具后面的值来确定
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
马哥的解决方法可行 问题描述的不是很清楚,原因是我的参数类型要根据后面的类型值确定他是哪个参数名,所以想有个动态可选、像重载["name"]类似的最好,马哥的方法间接实现了
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
引用 11 楼 正怒月神 的回复:
但是既然能这么传递给你,为何不给你一个json呢。直接映射到你api的People类就好了。
好想法。
忆水思寒 2020-06-29
  • 打赏
  • 举报
回复
引用 13 楼 icoolno1 的回复:
[quote=引用 12 楼 icoolno1 的回复:] 楼主的意思是不是想定义一个类索引啊?不过索引没见得有多方便啊

using System;
namespace IndexerApplication
{
   class IndexedNames
   {
      private string[] namelist = new string[size];
      static public int size = 10;
      public IndexedNames()
      {
         for (int i = 0; i < size; i++)
         {
          namelist[i] = "N. A.";
         }
      }
      public string this[int index]
      {
         get
         {
            string tmp;

            if( index >= 0 && index <= size-1 )
            {
               tmp = namelist[index];
            }
            else
            {
               tmp = "";
            }

            return ( tmp );
         }
         set
         {
            if( index >= 0 && index <= size-1 )
            {
               namelist[index] = value;
            }
         }
      }
      public int this[string name]
      {
         get
         {
            int index = 0;
            while(index < size)
            {
               if (namelist[index] == name)
               {
                return index;
               }
               index++;
            }
            return index;
         }

      }

      static void Main(string[] args)
      {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";
         // 使用带有 int 参数的第一个索引器
         for (int i = 0; i < IndexedNames.size; i++)
         {
            Console.WriteLine(names[i]);
         }
         // 使用带有 string 参数的第二个索引器
         Console.WriteLine(names["Nuha"]);
         Console.ReadKey();
      }
   }
}
当上面的代码被编译和执行时,它
重贴一个例子:

//以字符串为下标的索引器
    public class IDXer2
    {
        private Hashtable name = new Hashtable();

        //以字符串为下标的索引器
        public string this[string index]
        {
            get
            {
                return name[index].ToString();
            }
            set
            {
                name.Add(index, value);
            }
        } 
    }

    public class Program
    {
        static void Main(string[] args)
        {
            //以字符串为下标的索引器
            IDXer2 indexer2 = new IDXer2();
            indexer2["A01"] = "张三";
            indexer2["A02"] = "李四";
            Console.WriteLine(indexer2["A01"]);
            Console.WriteLine(indexer2["A02"]);
            Console.ReadKey();
        }
  }
[/quote] //是下面的意思,不过已经有间接方法了 public class IDXer2 { string id; } string name; if(name=="id") { IDXer2[name]=XXX;//此时也即使对IDXer2.id=XXX赋值 }
八爻老骥 2020-06-29
  • 打赏
  • 举报
回复
当然也可以定义一个数据字典啦,索引或属性值都从字典里拿,也可以直接操作字典。
八爻老骥 2020-06-29
  • 打赏
  • 举报
回复
引用 12 楼 icoolno1 的回复:
楼主的意思是不是想定义一个类索引啊?不过索引没见得有多方便啊

using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
{
namelist[i] = "N. A.";
}
}
public string this[int index]
{
get
{
string tmp;

if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}

return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
public int this[string name]
{
get
{
int index = 0;
while(index < size)
{
if (namelist[index] == name)
{
return index;
}
index++;
}
return index;
}

}

static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
// 使用带有 int 参数的第一个索引器
for (int i = 0; i < IndexedNames.size; i++)
{
Console.WriteLine(names[i]);
}
// 使用带有 string 参数的第二个索引器
Console.WriteLine(names["Nuha"]);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它

重贴一个例子:

//以字符串为下标的索引器
public class IDXer2
{
private Hashtable name = new Hashtable();

//以字符串为下标的索引器
public string this[string index]
{
get
{
return name[index].ToString();
}
set
{
name.Add(index, value);
}
}
}

public class Program
{
static void Main(string[] args)
{
//以字符串为下标的索引器
IDXer2 indexer2 = new IDXer2();
indexer2["A01"] = "张三";
indexer2["A02"] = "李四";
Console.WriteLine(indexer2["A01"]);
Console.WriteLine(indexer2["A02"]);
Console.ReadKey();
}
}
八爻老骥 2020-06-29
  • 打赏
  • 举报
回复
楼主的意思是不是想定义一个类索引啊?不过索引没见得有多方便啊

using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
{
namelist[i] = "N. A.";
}
}
public string this[int index]
{
get
{
string tmp;

if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}

return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
public int this[string name]
{
get
{
int index = 0;
while(index < size)
{
if (namelist[index] == name)
{
return index;
}
index++;
}
return index;
}

}

static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
// 使用带有 int 参数的第一个索引器
for (int i = 0; i < IndexedNames.size; i++)
{
Console.WriteLine(names[i]);
}
// 使用带有 string 参数的第二个索引器
Console.WriteLine(names["Nuha"]);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它
正怒月神 版主 2020-06-29
  • 打赏
  • 举报
回复
引用 10 楼 忆水思寒 的回复:
[quote=引用 8 楼 正怒月神 的回复:] 不需要整反射这套东西。
版主我的意思你可能没理解清楚,如你代码,假如main中有个变量叫PropertyName,它对应的值的string可能是id,name,age其中一项,那你怎么能根据它的值来用Test对应的属性接收呢[/quote] 好吧,如果人家只传递给你属性名和值。 你按照反射去弄,是没问题。 但是既然能这么传递给你,为何不给你一个json呢。直接映射到你api的People类就好了。
threenewbee 2020-06-28
  • 打赏
  • 举报
回复
PropertyInfo pi = t.GetProperty(属性名);
pi.SetValue(对象,值);
winzond 2020-06-28
  • 打赏
  • 举报
回复
测试了一下,C#好像不能这样写哈,那只能switch一下了,

switch(name){
    case "name"  :
       people.name=pi.Name;
       break; 
       ......................
}
忆水思寒 2020-06-28
  • 打赏
  • 举报
回复
[name] 是属性名,怎么设置一个动态的,给他动态赋值呢

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧