How to fix Error The type 'object' cannot be used as type parameter 'TToken' in the generic type or method?

98 views Asked by At

I'm doing a migration to .NET MAUI from Xamarin Forms. Here I am converting the MessagingCenter of Xamarin Forms to WeakReferenceManager of .NET MAUI. This is my Following code of Xamarin Forms:

MessagingCenter.Subscribe<object, object>(this, Messages.Messenger.Messages.xyz, this.XYZ);

This code is working fine for me. But when I am converting this to WeakReferenceManager as you can see the following:

WeakReferenceMessenger.Default.Register<object, object>(this, Messages.Messenger.Messages.xyz, this.XYZ);

I get the following error:

Error CS0311 The type 'object' cannot be used as type parameter 'TToken' in the generic type or method 'IMessengerExtensions.Register<TMessage, TToken>(IMessenger, object, TToken, MessageHandler<object, TMessage>)'. There is no implicit reference conversion from 'object' to 'System.IEquatable'.

I have no clue how to fix this error. Any suggestions?

1

There are 1 answers

1
Jessie Zhang -MSFT On

You can refer to the official document: Sending and receiving messages.

Please refer to the following code:

 // Create a message (e.g. `MyMessage`) you want to pass in your app
public class MyMessage : ValueChangedMessage<string>
{
    public MyMessage(string value): base(value)
    {        
    }
}

// Register a message where you want to receive message
WeakReferenceMessenger.Default.Register<MyMessage>(this, (r, m) =>
{
    // Handle the message here, with r being the recipient and m being the
    // input message. Using the recipient passed as input makes it so that
    // the lambda expression doesn't capture "this", improving performance.

      var receivedstring = m.value;
});

// Send a message
WeakReferenceMessenger.Default.Send(new MyMessage("test string"));

Note:

You can also replace the passed string to Object item you want to pass.

Here is a usage example:

1.define a message (The TestVisibleModel is the type of the passed object)

 public class VisibleChangedMessage : ValueChangedMessage<TestVisibleModel> 
{
    public VisibleChangedMessage(TestVisibleModel value) : base(value)
    {

    }
}

2.Register a message:

   TestVisibleModel  visibleModel = new TestVisibleModel();

    // Register a message in some module
    WeakReferenceMessenger.Default.Register<VisibleChangedMessage>(this, (r, m) =>
    {
        //receive the message here
        visibleModel.IsVisible1 = m.Value.IsVisible1;

    });

3.Send message:

    TestVisibleModel model = new TestVisibleModel();
    model.IsVisible1 = false;

    // Send a message from some other module
    WeakReferenceMessenger.Default.Send(new VisibleChangedMessage(model));