使用反射在C#中为对象添加属性。

4

我想创建一个方法,接收3个字符串作为参数,并返回一个包含这些字符串所指代的三个属性的对象。

没有一个“旧对象”进行复制。这些属性应该在这个方法中创建。

可以使用C#中的反射来实现吗?如果可以,如何做?以下是您希望的内容,但我无法完成。

protected Object getNewObject(String name, String phone, String email)
{
    Object newObject = new Object();

    ... //I can not add the variables that received by the object parameter here.

    return newObject();
}

1
那么你将如何访问这些属性?从动态访问的角度来看,DynamicObject可能是你可以轻松使用的最接近的方法。不过我们确实需要更多的上下文信息。 - Jon Skeet
1
这些属性从哪里获取?"oldObject"在哪里? - xanatos
3个回答

5

4
protected dynamic getNewObject(String name, String phone, String email)
{
    return new { name = name, phone = phone, email = email };
}

这是正确的答案。使用反射添加属性并不是解决方案,因为他以后将无法在没有反射的情况下访问它们。如果是这种情况,为什么不直接创建一个类呢?还不如使用 dynamic - Artless
1
我没有给你点踩,但从技术上讲应该是:return new { name = GetWithReflectionTheNameOfSomething(), phone = GetWith...(), email = GetWith...() }; - xanatos
除非他真的想要一个具有名为 name 的属性且该属性值为 name 参数字符串的匿名对象。 - xanatos
匿名类型仅可在同一方法内使用。虽然可以通过反射来使用其结果,但这样做非常麻烦。[好的,在添加返回动态类型后,似乎没问题了] - H H
@HenkHolterman 我一直认为使用匿名类型非常容易 :-) http://ideone.com/mIswW5 - xanatos
显示剩余2条评论

1
一个使用Expando对象的完整示例如下:
protected dynamic getNewObject(String name, String phone, String email)
    {


        // ... //I can not add the variables that received by the object parameter here.
        dynamic ex = new ExpandoObject();
        ex.Name = name;
        ex.Phone = phone;
        ex.Email = email;
        return ex;
    }

    private void button1_Click_2(object sender, EventArgs e)
    {
        var ye = getNewObject("1", "2", "3");
        Console.WriteLine(string.Format("Name = {0},Phone = {1},Email={2}", ye.Name, ye.Phone, ye.Email));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接