1

如何通过 ref 传递内部具有相同属性的不同类型的对象并在没有接口的情况下填充它们。

在我的应用程序中有完全不同的类型,它们具有一些共同的属性。假设这个属性是双数组。

double[] samples;

现在我必须为 20 个对象填充这些样本。我无权访问该对象的类定义,因此无法制作接口,也无法使它们从基类继承。

如何使用我调用的一种方法和这种方法来填充我的所有属性。

我想要一种这样的方法:

private static void FillSamples(ref WhoKnowsWhat dataType, MyObject theSamples)
{

for (int i = 0; i < sampleCount; i++)
                        {
                            dataType.SampleLength[i] = MyObject.X[i];
                            dataType.SampleValue[i]  = MyObject.y[i];
                        }
}

并用完全不同的类型来称呼它。

FillSamples(ref BigStruct.OneTypeMine, theSamples);
FillSamples(ref BigStruct.AnotherTypeMine, theSamples);
FillSamples(ref BigStruct.HisType12345, theSamples);

然后大结构应该在最后填充这些样本。

C#有办法吗?

谢谢!

4

3 回答 3

4

您可以使用动态关键字:

private static void FillSamples(dynamic dataType, MyObject theSamples)
{
    for (int i = 0; i < sampleCount; i++)
    {
        dataType.SampleLength[i] = MyObject.X[i];
        dataType.SampleValue[i]  = MyObject.y[i];
    }
}

编辑:

使用反射(如果您不使用 .Net 4.0 或更高版本):

private static void FillSamples(object dataType, MyObject theSamples)
{
    Type t = dataType.GetType();
    var px = t.GetProperty("SampleLength");
    var py = t.GetProperty("SampleValue");

    for (int i = 0; i < sampleCount; i++)
    {
        px.SetValue(dataType, MyObject.X[i], null);
        py.SetValue(dataType, MyObject.Y[i], null);
    }
}
于 2012-08-15T12:50:32.190 回答
1

不知道它是否对您有任何帮助,但您可以使用反射来找出对象在运行时支持的属性(以及字段、方法等)。例如,如果您有兴趣了解更多信息,请查看http://www.csharp-examples.net/reflection-property-names/ 。

于 2012-08-15T12:54:17.090 回答
1

您可以使用动态对象。定位动态对象的字段时应该小心,因为它们无法在编译时检查。请参阅下面的示例:

[TestFixture]
public class DynamicObjects
{
    [Test]
    public void Dynamic_Call()
    {
        dynamic obj1 = new Apple();
        obj1.Weight = 100;
        obj1.Color = "Red";

        dynamic obj2 = new Orange();
        obj2.Weight = 200;
        obj2.Width = 10;

        Assert.IsTrue(obj1.Weight < obj2.Weight);
    }
}

public class Apple
{
    public int Weight { get; set; }
    public string Color { get; set; }
}

public class Orange
{
    public int Weight { get; set; }
    public int Width { get; set; }
}
于 2012-08-15T12:56:20.917 回答